1. PHP面试核心考点解析
作为一门已有27年历史的服务器端脚本语言,PHP至今仍占据着Web开发领域的重要地位。根据W3Techs的最新统计,全球78.9%的网站使用PHP作为服务器端编程语言。对于准备PHP开发岗位的求职者来说,掌握以下核心面试题不仅能帮助通过技术考核,更能系统性地检验自己的知识体系完整度。
1.1 基础语法与特性
PHP的弱类型特性是面试中最常被深入探讨的话题之一。当比较整数12和字符串"13"时,PHP会执行类型强制转换:
var_dump(12 == "13"); // bool(false) var_dump(12 == "12"); // bool(true)这种隐式类型转换在实际开发中可能引发难以察觉的bug。建议使用严格比较运算符:
var_dump(12 === "12"); // bool(false)静态变量的生命周期是另一个重点。与普通局部变量不同,静态变量在函数调用间保持其值:
function counter() { static $count = 0; return ++$count; } echo counter(); // 1 echo counter(); // 2提示:静态变量仅初始化一次,适合用于函数调用计数、缓存等场景,但滥用可能导致内存泄漏。
1.2 面向对象编程
PHP的继承机制采用单继承模型,通过traits实现代码复用。面试官常考察对final关键字的理解:
class BaseClass { final public function lockMethod() { // 该方法不能被子类重写 } }对象比较时,==检查属性值是否相同,===检查是否为同一实例:
class Foo {} $a = new Foo(); $b = new Foo(); var_dump($a == $b); // true var_dump($a === $b); // false魔术方法是OOP面试的重点,__sleep()和__wakeup()常用于序列化控制:
class User { private $password; public function __sleep() { return ['username']; // 不序列化password } public function __wakeup() { $this->loadData(); // 重建时初始化 } }1.3 数据库交互
MySQLi和PDO是PHP连接数据库的两种主流方式。安全查询应该使用预处理语句:
$stmt = $mysqli->prepare("SELECT * FROM users WHERE email = ?"); $stmt->bind_param("s", $email); $stmt->execute();面试中常被问及mysqli_fetch_array()、mysqli_fetch_assoc()和mysqli_fetch_object()的区别:
mysqli_fetch_array():返回索引+关联数组mysqli_fetch_assoc():仅返回关联数组mysqli_fetch_object():返回stdClass对象
注意:生产环境应避免使用已废弃的mysql扩展,优先选择PDO以获得更好的跨数据库支持。
2. 高级特性与安全实践
2.1 会话管理与安全
PHP会话默认使用文件存储,可通过session_set_save_handler()实现自定义存储:
session_set_save_handler( [$this, 'open'], [$this, 'close'], [$this, 'read'], [$this, 'write'], [$this, 'destroy'], [$this, 'gc'] );防范会话固定攻击的措施包括:
session_regenerate_id(true); // 重要操作前更换session ID ini_set('session.cookie_httponly', 1); // 禁止JS访问cookie ini_set('session.cookie_secure', 1); // 仅HTTPS传输2.2 错误处理与调试
PHP7引入的Error异常使得错误处理更加一致:
set_error_handler(function($errno, $errstr) { throw new ErrorException($errstr, 0, $errno); }); try { // 可能出错的代码 } catch (ErrorException $e) { error_log($e->getMessage()); }对于生产环境,应该配置:
display_errors = Off log_errors = On error_log = /path/to/php_errors.log2.3 性能优化技巧
OPcache是提升PHP性能最有效的方式之一,配置示例:
opcache.enable=1 opcache.memory_consumption=128 opcache.max_accelerated_files=4000 opcache.validate_timestamps=0 ; 生产环境关闭时间戳验证数据库查询优化建议:
- 使用
EXPLAIN分析慢查询 - 为常用查询字段添加索引
- 避免
SELECT *,只获取必要字段 - 考虑使用Redis缓存热点数据
3. 现代PHP开发实践
3.1 Composer与依赖管理
现代PHP项目几乎都使用Composer管理依赖。面试常问的composer.json配置项:
{ "require": { "monolog/monolog": "^2.0" }, "autoload": { "psr-4": { "App\\": "src/" } } }PSR规范是另一个重点,特别是:
- PSR-4:自动加载标准
- PSR-7:HTTP消息接口
- PSR-11:容器接口
3.2 测试驱动开发
PHPUnit是PHP的标准测试框架。典型的测试类结构:
class UserTest extends TestCase { public function testUsernameValidation() { $user = new User(); $this->assertFalse($user->validateUsername('ab')); $this->assertTrue($user->validateUsername('validname')); } }Mock对象的使用:
$mock = $this->createMock(UserRepository::class); $mock->method('find')->willReturn(new User());3.3 框架核心概念
即使应聘岗位不使用框架,理解MVC模式也是必须的:
- 模型(Model):数据处理和业务逻辑
- 视图(View):数据展示层
- 控制器(Controller):接收请求并协调模型和视图
依赖注入容器的工作机制:
class Container { protected $bindings = []; public function bind($abstract, $concrete) { $this->bindings[$abstract] = $concrete; } public function make($abstract) { return call_user_func($this->bindings[$abstract]); } }4. 实战问题排查与优化
4.1 常见性能瓶颈
慢查询日志分析步骤:
- 在MySQL配置中启用慢查询日志
- 使用
mysqldumpslow工具分析日志 - 使用
EXPLAIN分析问题查询 - 添加适当索引或重写查询
内存泄漏排查方法:
gc_enable(); // 启用垃圾回收 $before = memory_get_usage(); // 执行可疑代码 $after = memory_get_usage(); echo "Memory used: ".($after-$before)." bytes";4.2 调试技巧
Xdebug配置关键参数:
xdebug.remote_enable=1 xdebug.remote_autostart=1 xdebug.remote_host=localhost xdebug.remote_port=9000使用debug_backtrace()进行问题追踪:
function debug() { $trace = debug_backtrace(); foreach ($trace as $item) { echo "{$item['file']}:{$item['line']} {$item['function']}\n"; } }4.3 安全防护措施
SQL注入防护的完整方案:
- 始终使用预处理语句
- 对动态表名/列名进行白名单验证
- 设置数据库用户最小权限
XSS防护策略:
// 输出到HTML上下文 htmlspecialchars($input, ENT_QUOTES, 'UTF-8'); // 输出到JavaScript上下文 json_encode($input, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT);文件上传安全要点:
- 验证文件类型(不依赖扩展名)
- 存储上传文件到非web目录
- 重命名上传文件
- 设置文件大小限制
在准备PHP面试时,除了记住这些问题的答案,更重要的是理解背后的原理。建议将这些问题作为检查清单,针对薄弱环节进行针对性学习。实际开发经验往往比理论知识更能打动面试官,准备时可以结合自己参与过的项目,展示如何应用这些知识解决实际问题。