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 如何实现继承、抽象类和接口?

  • 答案:
    1. 继承:使用 extends 关键字(单继承)
    2. 抽象类:abstract class 定义,可包含抽象方法(无实现)和具体方法
    3. 接口: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 中的文件上传处理?

  • 答案:
    1. 前端表单:enctype=”multipart/form-data”,多个文件用数组 $_FILES[‘file’][] 接收。
    2. 后端处理:
      • $_FILES[‘file’][‘error’]:检查上传错误码。
      • move_uploaded_file():移动临时文件到指定位置。
      • 安全校验(文件名、文件类型、大小限制)。
  • 答案:
    • 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()都会返回true
    • empty():检查变量是否被视为 “空”。如果变量不存在,或其值为以下任何一种情况,则返回true
      • “”(空字符串)
      • 0(整数 0)
      • 0.0(浮点数 0.0)
      • “0”(字符串 “0”)
      • NULL
      • FALSE
      • [](空数组)
      • $var;(声明但未赋值的变量)

问题:合并两个数组的方法及区别?

  • 答案:
    • array_merge($a, $b):
      • 字符串键:后数组覆盖前数组。
      • 数字键:重新索引(从 0 开始)。
    • $a + $b:保留第一个数组的键值(相同键名时不覆盖)。

问题:如何反转包含中文的字符串?

  • 答案:
    • PHP 7+:mb_strrev() 函数(多字节字符串函数)
    • 自定义函数:遍历字符串,从后往前拼接。

问题:PHP 中的错误处理机制?

  • 答案:
    • PHP 错误分为两种:
      • 运行时错误(Fatal Error):无法恢复,如语法错误、内存不足等。
      • 异常(Exception):可捕获的业务错误,如文件未找到、数据库连接失败等。
    • 错误处理机制:
      • try-catch 语句:捕获异常,提供自定义错误处理逻辑。
      • set_exception_handler():全局异常处理函数。
      • 错误日志:记录运行时错误,如 error_log() 函数。

问题:PHP 中的文件上传处理?

  • 答案:
    1. 前端表单:enctype=”multipart/form-data”,多个文件用数组 $_FILES[‘file’][] 接收。
    2. 后端处理:
      • $_FILES[‘file’][‘error’]:检查上传错误码。
      • move_uploaded_file():移动临时文件到指定位置。
      • 安全校验(文件名、文件类型、大小限制)。
  • 答案:
    • 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
    10
    class 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目录

问题: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等