当前位置:首页>php>PHP 面试题精选

PHP 面试题精选

  • 2026-09-08 18:13:09
PHP 面试题精选

PHP 面试高频问题和答案。


基础篇

1. PHP 7/8 有哪些新特性?

PHP 7:

  • 性能提升 2 倍
  • 标量类型声明
  • 返回类型声明
  • 空合并运算符 ??
  • 太空船运算符 <=>
  • 匿名类

PHP 8:

  • JIT 编译器
  • 命名参数
  • Attributes 注解
  • Match 表达式
  • 构造器属性提升
  • 联合类型
  • Nullsafe 运算符 ?->

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. 接口和抽象类的区别?

特性
接口
抽象类
方法实现
不能有
可以有
属性
只能常量
可以有
多继承
支持
不支持
访问修饰符
只能 public
都可以

使用场景:

  • 接口:定义规范,多个不相关类实现
  • 抽象类:共享代码,有继承关系

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 性能?

代码层面:

  • 使用 OPcache
  • 避免在循环中查询数据库
  • 使用缓存(Redis)
  • 减少文件 I/O

配置层面:

  • 调整 PHP-FPM 进程数
  • 开启 OPcache
  • 调整内存限制

架构层面:

  • 使用 CDN
  • 数据库读写分离
  • 使用消息队列异步处理

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);
});
// 响应返回

总结

类别
重点
基础
类型比较、引用、静态绑定
OOP
接口、抽象类、Trait、依赖注入
性能
OPcache、缓存、异步
安全
SQL 注入、XSS、密码存储
框架
服务容器、中间件、生命周期

面试前多刷题,理解原理比死记硬背更重要。

最新文章

随机文章