面试题
PHP 面试笔试常见题汇总
PHP 基础知识
变量与数据类型
问题:PHP 有哪些基本数据类型?如何判断变量类型?
- 答案:
基本类型:- 标量类型:boolean、integer、float、string
- 复合类型:array、object
- 特殊类型:null、resource
- 判断方法:gettype()、is_*() 系列函数(如 is_array())、instanceof(对象类型)。
问题:== 和 === 的区别?
- 答案:
- ==:仅比较值是否相等(类型会自动转换),如 5 == ‘5’ 为 true。
- ===:严格比较(值和类型均需相同),如 5 === ‘5’ 为 false。
问题:PHP 中的引用与值传递的区别?
- 答案:
- 引用:传递变量的内存地址,函数内部修改会影响原始变量。
- 值传递:复制变量的值,函数内部修改不影响原始变量。
面向对象编程(OOP)
问题:PHP 如何实现继承、抽象类和接口?
- 答案:
- 继承:使用
extends
关键字(单继承) - 抽象类:
abstract class
定义,可包含抽象方法(无实现)和具体方法 - 接口:interface 定义,所有方法必须为抽象方法,类通过
implements
实现接口(多实现)
- 继承:使用
问题:PSR 规范是什么?常见规范有哪些?
- 答案:
- PSR 是 PHP 社区的代码规范标准(由 PHP-FIG 制定)
- 常见规范:
- PSR-1:基础代码风格(命名、文件格式等)
- PSR-4:自动加载规范(命名空间与文件路径映射)
- PSR-7:HTTP 消息接口(请求 / 响应对象规范)
- PSR-11:容器接口(依赖注入容器规范)
- PSR-12:编码规范(代码风格、自动加载等)
问题:PHP 中的错误处理机制?
- 答案:
- PHP 错误分为两种:
- 运行时错误(Fatal Error):无法恢复,如语法错误、内存不足等。
- 异常(Exception):可捕获的业务错误,如文件未找到、数据库连接失败等。
- 错误处理机制:
- try-catch 语句:捕获异常,提供自定义错误处理逻辑。
- set_exception_handler():全局异常处理函数。
- 错误日志:记录运行时错误,如 error_log() 函数。
- PHP 错误分为两种:
问题:PHP 中的文件上传处理?
- 答案:
- 前端表单:enctype=”multipart/form-data”,多个文件用数组 $_FILES[‘file’][] 接收。
- 后端处理:
- $_FILES[‘file’][‘error’]:检查上传错误码。
- move_uploaded_file():移动临时文件到指定位置。
- 安全校验(文件名、文件类型、大小限制)。
问题:PHP 中的 session 与 cookie 有什么区别?
- 答案:
- Session:服务器端会话管理,存储用户状态信息。
- Cookie:客户端存储机制,用于跟踪用户会话。
- 区别:
- 存储位置:Session 数据存储在服务器端,Cookie 数据存储在客户端。
- 安全性:Session 数据相对安全(依赖 Cookie 机制),Cookie 数据可被篡改。
- 大小限制:Session 无大小限制,Cookie 数据大小受浏览器限制(4KB)。
- 使用场景:Session 用于存储敏感信息,Cookie 用于用户追踪。
问题:PHP 中的魔术方法有哪些?
- 答案:
- 构造方法:__construct()、__destruct()
- 运算符重载:__toString()、__invoke()、__set()、__get() 等
- 数组操作:__set()、__get()、__isset()、__unset() 等
- 类与对象:__clone()、__sleep()、__wakeup() 等
- 异常处理:__toString()、__invoke()、__set()、__get() 等
- 序列化:__sleep()、__wakeup()
- 调用:__invoke()
- 调试:__debugInfo()
数组与字符串处理
问题: isset()和empty()的区别
- 答案:
isset()
:检查变量是否已设置且不为NULL
。即使变量值为0、空字符串’’、空数组[]等,只要变量存在且不是NULL,isset()都会返回trueempty()
:检查变量是否被视为 “空”。如果变量不存在,或其值为以下任何一种情况,则返回true- “”(空字符串)
- 0(整数 0)
- 0.0(浮点数 0.0)
- “0”(字符串 “0”)
- NULL
- FALSE
- [](空数组)
- $var;(声明但未赋值的变量)
问题:合并两个数组的方法及区别?
- 答案:
- array_merge($a, $b):
- 字符串键:后数组覆盖前数组。
- 数字键:重新索引(从 0 开始)。
- $a + $b:保留第一个数组的键值(相同键名时不覆盖)。
- array_merge($a, $b):
问题:如何反转包含中文的字符串?
- 答案:
- PHP 7+:mb_strrev() 函数(多字节字符串函数)
- 自定义函数:遍历字符串,从后往前拼接。
问题:PHP 中的错误处理机制?
- 答案:
- PHP 错误分为两种:
- 运行时错误(Fatal Error):无法恢复,如语法错误、内存不足等。
- 异常(Exception):可捕获的业务错误,如文件未找到、数据库连接失败等。
- 错误处理机制:
- try-catch 语句:捕获异常,提供自定义错误处理逻辑。
- set_exception_handler():全局异常处理函数。
- 错误日志:记录运行时错误,如 error_log() 函数。
- PHP 错误分为两种:
问题:PHP 中的文件上传处理?
- 答案:
- 前端表单:enctype=”multipart/form-data”,多个文件用数组 $_FILES[‘file’][] 接收。
- 后端处理:
- $_FILES[‘file’][‘error’]:检查上传错误码。
- move_uploaded_file():移动临时文件到指定位置。
- 安全校验(文件名、文件类型、大小限制)。
问题:PHP 中的 session 与 cookie 有什么区别?
- 答案:
- Session:服务器端会话管理,存储用户状态信息。
- Cookie:客户端存储机制,用于跟踪用户会话。
- 区别:
- 存储位置:Session 数据存储在服务器端,Cookie 数据存储在客户端。
- 安全性:Session 数据相对安全(依赖 Cookie 机制),Cookie 数据可被篡改。
- 大小限制:Session 无大小限制,Cookie 数据大小受浏览器限制(4KB)。
- 使用场景:Session 用于存储敏感信息,Cookie 用于用户追踪。
问题:PHP 中的魔术方法有哪些?
- 答案:
- 构造方法:__construct()、__destruct()
- 运算符重载:__toString()、__invoke()、__set()、__get() 等
- 数组操作:__set()、__get()、__isset()、__unset() 等
- 类与对象:__clone()、__sleep()、__wakeup() 等
- 异常处理:__toString()、__invoke()、__set()、__get() 等
- 序列化:__sleep()、__wakeup()
- 调用:__invoke()
- 调试:__debugInfo()
PHP 核心机制
1. 超全局变量
- 作用:提供全局访问变量,无需在每个函数中声明。
- 类型:数组,键名对应变量名,值对应变量值。
- 示例:
1
2$_GET['name'] = 'Alice';
echo $_GET['name']; // 输出 'Alice'
2. 变量作用域
- 作用:确定变量的可见性与生命周期。
- 分类:全局作用域、局部作用域(函数内)。
- 示例:
1
2
3
4
5
6
7
8$globalVar = 'Global'; // 全局作用域
function localVar() {
$localVar = 'Local'; // 局部作用域
echo $localVar; // 输出 'Local'
}
echo $globalVar; // 输出 'Global'
localVar();
echo $localVar; // 报错,未定义 $localVar
3. 数据类型与内存管理
- 数据类型:标量(布尔、整数、浮点数、字符串)、复合(数组、对象)。
- 内存管理:
- 引用计数:PHP使用引用计数机制管理内存,每个变量都有一个引用计数器,当引用计数为0时自动释放内存。
- 垃圾回收:PHP 5.3+引入了垃圾回收机制,用于处理循环引用问题。
- 内存限制:可通过php.ini中的memory_limit配置项设置PHP脚本的最大内存使用量。
- 内存泄漏:常见原因包括未释放的资源、循环引用、长时间运行的脚本等。
- 优化策略:
- 及时释放大型变量(使用unset())
- 避免在循环中创建大量对象
- 使用生成器(Generator)处理大数据集
- 合理设置内存限制
- 动态分配:变量在使用时分配内存,无需声明。
- 引用计数:每个变量有引用计数,当计数为 0 时立即释放内存。
- 循环引用处理:通过 周期回收算法 检测并清理循环引用的变量(如两个对象互相引用)。
- 内存泄漏:长时间占用内存,导致系统性能下降。
- 内存优化:及时释放不再使用的变量,如 unset() 函数。
4. 函数与作用域
- 函数定义:封装可复用代码,提高代码模块化。
- 作用域:
- 全局作用域:在函数外部定义,在所有函数内部可见。
- 局部作用域:在函数内部定义,仅在函数内部可见。
- 示例:
1
2
3
4
5
6
7
8
9
10
11
12$globalVar = 'Global';
function localVar() {
$localVar = 'Local';
echo $localVar; // 输出 'Local'
}
function localVar2() {
global $globalVar; // 使用global关键字访问全局变量
echo $globalVar; // 输出 'Global'
echo $localVar; // 报错,未定义 $localVar
}
localVar();
localVar2();
框架与设计模式
问题:Laravel框架的核心特性有哪些?
- 答案:
- 依赖注入容器:实现控制反转(IoC)
- 优雅的路由系统:支持RESTful API
- Eloquent ORM:ActiveRecord模式的ORM实现
- 中间件:处理HTTP请求的过滤器
- Blade模板引擎:轻量级且功能强大的模板系统
- Artisan命令行工具:自动化常见任务
- 事件系统:实现观察者模式的事件处理
问题:常见的设计模式及其在PHP中的应用?
- 答案:
- 单例模式:确保一个类只有一个实例(如数据库连接)
1
2
3
4
5
6
7
8
9
10class Database {
private static $instance = null;
private function __construct() {}
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
}- 工厂模式:创建对象的接口,让子类决定实例化哪个类
- 观察者模式:对象间的一对多依赖关系(如事件监听)
- 策略模式:定义一系列算法,使它们可以互相替换(如支付方式)
- 装饰器模式:动态地给对象添加额外的职责(如中间件)
问题:MVC架构的优缺点?
- 答案:
- 优点:
- 关注点分离,提高代码可维护性
- 便于团队协作(前端/后端分工)
- 代码复用性高
- 利于测试(各层可独立测试)
- 缺点:
- 学习成本较高
- 小型项目可能过度设计
- 性能开销(多层调用)
- 优点:
数据库与缓存
问题:MySQL索引的类型及其适用场景?
- 答案:
- 主键索引:表中的主键,唯一且非空
- 唯一索引:确保列中的值唯一,可以为空
- 普通索引:加速查询,无唯一性约束
- 全文索引:用于全文搜索
- 复合索引:多列组合索引,遵循最左前缀原则
问题:Redis的数据类型及应用场景?
- 答案:
- String:缓存、计数器、分布式锁
- Hash:存储对象,如用户信息
- List:消息队列、最新动态
- Set:去重、交集运算(共同好友)
- Sorted Set:排行榜、优先级队列
问题:如何优化慢查询?
- 答案:
- 索引优化:创建合适的索引,避免全表扫描
- SQL优化:避免SELECT *,使用LIMIT限制结果集
- 表结构优化:合理设计表结构,适当冗余
- 缓存策略:使用Redis等缓存热点数据
- 分库分表:水平/垂直拆分大表
安全与性能
问题:常见的Web安全漏洞及防范措施?
- 答案:
- SQL注入:
- 漏洞:未过滤的用户输入直接拼接SQL
- 防范:预处理语句、参数绑定、ORM
- XSS(跨站脚本):
- 漏洞:未过滤的用户输入被渲染为HTML
- 防范:htmlspecialchars()、CSP策略
- CSRF(跨站请求伪造):
- 漏洞:利用用户已认证的身份执行未授权操作
- 防范:CSRF令牌、SameSite Cookie
- 文件上传漏洞:
- 漏洞:上传恶意文件(如PHP木马)
- 防范:文件类型验证、重命名文件、存储在非Web目录
- SQL注入:
问题:PHP性能优化的方法?
- 答案:
- 代码层面:
- 使用适当的数据结构和算法
- 避免重复计算(缓存结果)
- 减少I/O操作(合并读写)
- 配置层面:
- 启用OPcache(字节码缓存)
- 调整PHP-FPM配置(进程数、内存限制)
- 使用PHP 7+(性能显著提升)
- 架构层面:
- 使用缓存系统(Redis、Memcached)
- 负载均衡(多服务器分担请求)
- CDN加速静态资源
- 代码层面:
现代PHP开发
问题:Composer的作用及基本使用?
- 答案:
- 作用:PHP的依赖管理工具,类似npm、pip
- 基本使用:
- 安装包:
composer require vendor/package
- 更新依赖:
composer update
- 自动加载:
require 'vendor/autoload.php'
- 安装包:
- 核心文件:
- composer.json:定义项目依赖
- composer.lock:锁定依赖版本
问题:PHP 8的新特性有哪些?
- 答案:
- JIT编译:即时编译,提升性能
- 命名参数:提高代码可读性
- 属性(Attributes):替代注释文档
- 联合类型:更严格的类型检查
- 空安全操作符(?->):简化空值检查
- match表达式:更强大的switch替代品
问题:微服务架构在PHP中如何实现?
- 答案:
- 服务拆分:按业务领域拆分为独立服务
- API网关:统一入口,路由请求
- 服务发现:自动注册和发现服务
- 消息队列:异步通信(RabbitMQ、Kafka)
- 容器化:Docker + Kubernetes部署
- 框架选择:Lumen(轻量级Laravel)、Slim等
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 野鹤的小窝!