PHP 面试高频问题和答案。
基础篇
1. PHP 7/8 有哪些新特性?
PHP 7:
PHP 8:
2. == 和 === 的区别?
0 == '0'// true(类型转换后比较)
0 === '0'// false(类型和值都比较)
null == false// true
null === false// false
建议: 优先使用 ===,避免类型转换带来的问题。
3. isset 和 empty 的区别?
$a = null;
$b = '';
$c = 0;
$d = [];
isset($a); // false(null 返回 false)
isset($b); // true
isset($e); // false(未定义)
empty($a); // true
empty($b); // true(空字符串)
empty($c); // true(0)
empty($d); // true(空数组)
4. 传值和传引用的区别?
// 传值(复制)
functionaddOne($num){
$num++;
}
$a = 1;
addOne($a);
echo $a; // 1
// 传引用(同一内存)
functionaddOneRef(&$num){
$num++;
}
$b = 1;
addOneRef($b);
echo $b; // 2
5. static、self、$this 的区别?
classA{
publicstatic $name = 'A';
publicfunctiontest(){
echoself::$name; // 始终指向定义类 A
echostatic::$name; // 后期静态绑定,指向调用类
echo$this->name; // 实例属性
}
}
classBextendsA{
publicstatic $name = 'B';
}
(new B)->test(); // self: A, static: B
面向对象篇
6. 接口和抽象类的区别?
使用场景:
7. Trait 是什么?
Trait 是代码复用机制,解决单继承限制。
trait Loggable {
publicfunctionlog($msg){
echo"[LOG] $msg";
}
}
classUser{
useLoggable;
}
(new User)->log('test');
优先级: 当前类 > Trait > 父类
8. 什么是依赖注入?
不在类内部创建依赖,而是从外部注入。
// 不好:紧耦合
classUserService{
private $db;
publicfunction__construct(){
$this->db = new MySQL(); // 写死了
}
}
// 好:依赖注入
classUserService{
private $db;
publicfunction__construct(DatabaseInterface $db){
$this->db = $db; // 外部注入
}
}
好处: 解耦、易测试、易替换
性能篇
9. 如何优化 PHP 性能?
代码层面:
配置层面:
架构层面:
10. OPcache 原理?
PHP 执行流程:
PHP 代码 → 词法分析 → 语法分析 → 编译成 Opcode → 执行
OPcache 缓存编译后的 Opcode,跳过编译步骤。
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=10000
opcache.validate_timestamps=0 # 生产环境
安全篇
11. 如何防止 SQL 注入?
// 不好:直接拼接
$sql = "SELECT * FROM users WHERE id = $id";
// 好:预处理语句
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$id]);
// 好:ORM
User::find($id);
12. 如何防止 XSS?
// 输出时转义
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
// 设置 Cookie HttpOnly
setcookie('token', $value, ['httponly' => true]);
// CSP 头
header("Content-Security-Policy: default-src 'self'");
13. 密码如何安全存储?
// 加密
$hash = password_hash($password, PASSWORD_DEFAULT);
// 验证
if (password_verify($password, $hash)) {
// 登录成功
}
不要用: md5、sha1、自己加盐
框架篇
14. Laravel 服务容器原理?
服务容器是 IoC 容器,管理类的依赖和生命周期。
// 绑定
$this->app->bind(PaymentInterface::class, AlipayPayment::class);
// 解析
$payment = app(PaymentInterface::class);
原理: 反射 + 递归解析依赖
15. Laravel 中间件原理?
洋葱模型,请求和响应都经过中间件。
// 请求进入
$response = $middleware->handle($request, function($request){
return $next($request);
});
// 响应返回
总结
面试前多刷题,理解原理比死记硬背更重要。