1. PHP基础面试题概览
作为一门已经服务Web开发27年的脚本语言,PHP至今仍占据着78%的网站服务器端市场。在初级开发者面试中,基础概念的掌握程度往往决定着第一印象。以下是经过筛选的20个高频基础面试题,每个问题都附带场景化解析。
提示:这些问题不是死记硬背的答案,而是理解PHP运行机制的钥匙。我在技术面试中常通过追问"为什么这样设计"来考察候选人的深度。
2. 变量与数据类型
2.1 动态类型特性
PHP的弱类型特性常让初学者踩坑。面试官可能会让你对比:
php复制$a = "10";
$b = 10;
echo $a == $b; // true
echo $a === $b; // false
这里涉及三个核心考点:
==会进行类型转换比较(类型杂耍)===要求类型和值都相同- 常见隐式转换规则(如字符串转数字)
实际开发中,数据库查询结果比较必须用===,因为0 == "apple"也会返回true。
2.2 变量作用域
看这段典型陷阱代码:
php复制function test() {
$var = 1;
}
test();
echo $var; // Notice: Undefined variable
必须掌握的三种作用域:
- 局部变量(函数内部)
- 全局变量(需用global声明)
- 静态变量(保持值的持久性)
我在项目调试时发现,约30%的变量未定义错误源于对作用域的误解。
3. 函数核心机制
3.1 参数传递方式
值传递与引用传递的差异:
php复制function addValue($num) { $num += 1; }
function addReference(&$num) { $num += 1; }
$original = 5;
addValue($original); // 仍为5
addReference($original); // 变为6
内存层面的解释:
- 值传递:创建变量副本(COW机制)
- 引用传递:操作原始变量符号表
3.2 可变函数
PHP允许动态调用函数:
php复制function sayHi() { echo "Hello!"; }
$func = 'sayHi';
$func(); // 输出Hello
这种特性在实现回调系统时非常有用,但要注意:
- 必须进行
function_exists()检查 - 不要直接使用用户输入作为函数名(安全风险)
4. 数组深度解析
4.1 索引数组 vs 关联数组
php复制$indexed = [10, 20, 30]; // 索引从0开始
$assoc = ['name' => 'John', 'age' => 25];
面试常问的数组函数:
array_merge:合并时键名处理规则array_pushvs$arr[]:性能差异array_walk:带状态的回调处理
4.2 数组遍历陷阱
php复制$arr = [1, 2, 3];
foreach ($arr as &$value) {}
foreach ($arr as $value) {}
print_r($arr); // [1, 2, 2]
这是因为第一次循环后$value仍是引用,第二次循环会意外修改数组。解决方案:
- 用
unset($value)解除引用 - 使用不同的变量名
5. 错误处理体系
5.1 错误级别对照
PHP的错误分级机制:
php复制// php.ini配置示例
error_reporting = E_ALL & ~E_NOTICE
常见级别:
- E_ERROR:致命错误(脚本终止)
- E_WARNING:运行时警告
- E_NOTICE:建议性提示
5.2 异常处理实践
传统错误处理与现代异常对比:
php复制// 传统方式
if (!file_exists($path)) {
trigger_error("File not found", E_USER_WARNING);
}
// 异常方式
try {
if (!file_exists($path)) {
throw new RuntimeException("File not found");
}
} catch (Exception $e) {
error_log($e->getMessage());
}
在框架开发中,建议将传统错误转换为异常统一处理。
6. 字符串处理精髓
6.1 单引号与双引号
php复制$name = 'World';
echo 'Hello $name'; // Hello $name
echo "Hello $name"; // Hello World
性能差异:
- 单引号:直接输出,无解析开销
- 双引号:会解析变量和转义字符
6.2 正则表达式实战
验证邮箱的经典示例:
php复制$email = "test@example.com";
if (preg_match('/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/', $email)) {
echo "Valid";
}
常见正则函数:
preg_match:返回匹配次数preg_replace:模式替换preg_split:正则分割
7. 面向对象基础
7.1 类与对象
php复制class User {
private $name;
public function __construct($name) {
$this->name = $name;
}
public function greet() {
return "Hello, " . $this->name;
}
}
$user = new User('Alice');
echo $user->greet();
必问概念:
- 可见性修饰符(public/protected/private)
$this关键字- 构造方法
__construct
7.2 继承与多态
php复制class Animal {
public function speak() {
return "Sound";
}
}
class Dog extends Animal {
public function speak() {
return "Bark";
}
}
$animal = new Dog();
echo $animal->speak(); // Bark
面试官常考察:
parent::调用父类方法final关键字限制- 接口与抽象类的区别
8. 超全局变量解析
8.1 $_GET与$_POST
php复制// URL: page.php?id=123
$id = $_GET['id'] ?? 0; // null合并运算符
// 表单提交
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = $_POST['username'] ?? '';
}
安全注意事项:
- 必须过滤输入(如
filter_input()) - 避免直接输出到HTML(XSS风险)
- 关键操作要用POST请求
8.2 $_SESSION机制
php复制session_start();
$_SESSION['user'] = ['id' => 1, 'name' => 'Admin'];
// 其他页面
session_start();
$user = $_SESSION['user'] ?? null;
工作原理:
- 服务器生成唯一session_id
- 通过cookie传递给客户端
- 下次请求时带回服务器识别
9. 文件系统操作
9.1 文件读写安全
php复制$file = 'data.txt';
if (is_readable($file)) {
$content = file_get_contents($file);
}
// 写入时锁定文件
$fp = fopen($file, 'a');
flock($fp, LOCK_EX);
fwrite($fp, "New data\n");
flock($fp, LOCK_UN);
fclose($fp);
常见陷阱:
- 路径穿越攻击(如
../../etc/passwd) - 并发写入冲突
- 文件权限问题
9.2 文件上传处理
php复制if ($_FILES['photo']['error'] === UPLOAD_ERR_OK) {
$tmpName = $_FILES['photo']['tmp_name'];
$newName = 'uploads/' . basename($_FILES['photo']['name']);
if (move_uploaded_file($tmpName, $newName)) {
echo "Upload success";
}
}
必须检查:
is_uploaded_file()验证- 文件类型白名单
- 大小限制(php.ini中
upload_max_filesize)
10. 实战经验补充
10.1 性能优化技巧
- 避免在循环中连接数据库
- 使用
isset()比array_key_exists快30% - 用
===代替==省去类型转换 - 单引号字符串性能更优
10.2 常见面试陷阱题
php复制// 考题1:输出什么?
echo "1" + "2" * "3"; // 7
// 考题2:以下代码问题在哪?
$arr = ['a', 'b', 'c'];
foreach ($arr as $key => $value) {
$arr[$key] = strtoupper($value);
}
// 应改用array_map更合适
// 考题3:引用传递的副作用
function addItem(&$arr, $item) {
$arr[] = $item;
}
$list = [1, 2];
addItem($list, 3); // $list变为[1,2,3]
这些题目考察对PHP特性的深入理解,而非表面语法。
