Skip to content

colinlet/PHP-Interview-QA

Repository files navigation

PHP 面试问答

GitHub Repo stars GitHub forks License Questions 在线阅读 Last Updated

PHP 很没前途,请把工作留给我,谢谢!

系统性整理 PHP 技术面试高频问题,覆盖 PHP 语言、数据结构与算法、计算机网络、设计模式、存储与中间件、架构与分布式、操作系统与服务器、安全、Web、番外等方向。每道题包含一句话结论、体系讲解、追问链、易错点与可运行代码示例。

📖 在线阅读:colinlet.github.io/PHP-Interview-QA


求职行动链

求职行动链

求职行动链:投递 → 笔试 → 技术初面 → 技术终面 → 交叉面 → 综合面 → 谈薪/接受Offer

行动环节 求职者可以主动作为
1. 投递简历 / 内推 针对目标公司技术栈定制简历,量化成果;通过人脉或社区激活内推,获取真实反馈;前置调研公司产品与技术挑战,在简历中埋下匹配点。
2. 笔试 / 在线测试 靶向刷题:PHP 常见坑、数组函数、魔术方法、命名空间烂熟于心,辅以基本算法与数据结构;模拟限时编码环境,养成一次写对、注重边界条件的习惯;遇到模糊需求主动在平台提问澄清,展现严谨。
3. 技术初面 将八股文讲成理解,用实际场景解释 Redis 数据结构等知识点;准备 1 分钟埋钩子的自我介绍,引导面试官追问你最熟悉的项目;遇到不会的题不沉默,说出思考路径与排查方向。
4. 技术终面 用 STAR 法则深挖每个核心项目,突出个人决策与分析;主动要求画架构图,练习短链、秒杀、IM 消息推送等系统设计题,计算流量与存储;介绍技术选型时埋下对比方案,促成高质量追问。
5. 交叉面 展现可迁移能力,举例说明代码规范落地、跨团队协作的真实经验;准备有深度的问题反向调研对方(如“当前最大技术债是什么?”);用“我们”传递协作感,描述冲突时强调如何达成共识。
6. 综合面(HR/业务) 设计连贯的职业故事线,正面解释离职原因,具体说明来这里的动机;提前准备价值观问题(缺点、失败案例等)并附带改进动作;询问团队结构、培养机制,展现长期主义。
7. 谈薪 / 接受 Offer 面试中后期明确薪资期望,终面后主动提供流水等材料加速审批;以年度总包(现金+股票+奖金+公积金等)为基础做横向比较;书面确认试用期、转正标准、期权行权条件等关键细节,保护自身权益。

完整多方视角(HR / 面试官 / 业务方协作链路)见 面试全景图

难度图例

标签 全称 定位 适合谁
L1 Level 1 能正确使用,知道"是什么" 初级工程师(0-1 年)
L2 Level 2 能合理选择,知道"怎么用好" 中级工程师(1-3 年)
L3 Level 3 能解释原理,知道"为什么这样" 高级工程师(3-5 年)
L4 Level 4 能设计方案,源码级理解 资深工程师(5-10 年)
L5 Level 5 能权衡取舍,系统级决策 架构师(10 年+)

每道题还标注了考察频率(高 / 中 / 低),方便按紧迫度筛选复习重点。


主题导航

主题 目录 进度
PHP 语言篇 docs/php/ 🟡 进行中
数据结构与算法篇 docs/algorithm/ 🟡 进行中
计算机网络篇 docs/network/ 🟡 进行中
设计模式篇 docs/design-pattern/ 🟡 进行中
存储与中间件篇 docs/storage/ 🟡 进行中
架构与分布式篇 docs/architecture/ 🟡 进行中
操作系统与服务器篇 docs/server/ 🟡 进行中
Web 篇 docs/web/ 🟡 进行中
安全篇 docs/security/ 🟡 进行中
番外篇 docs/misc/ 🟡 进行中

考察频率分布

🔴 高频(必备) 🟡 中频(常见) ⚪ 低频(偶尔) — = 暂无题目

主题 L1 L2 L3 合计
PHP 语言篇 🔴×8 🟡×6 🔴×8 🟡×3 🔴×2 🟡×7 34
计算机网络篇 🔴×3 🔴×3 🟡×2 🔴×4 12
设计模式篇 🔴×1 🔴×1 🟡×1 3
存储与中间件篇 🔴×3 🔴×5 🔴×2 10
Web 篇 🔴×2 🔴×1 🔴×1 4
安全篇 🔴×1 🔴×1 🔴×1 3
数据结构与算法篇 🔴×7 🟡×3 🔴×6 🟡×3 🔴×2 21
操作系统与服务器篇 🔴×1 🔴×1 3
架构与分布式篇 2
番外篇 🟡×1 ⚪×1 2

随出题滚动更新。高频区域越密集,说明该方向面试考察概率越高,建议优先复习。


题目索引

PHP 语言篇

难度 频率 题目
L1 PHP 中 == 和 === 的区别是什么
L1 isset() 与 empty() 有什么区别
L1 PHP 索引数组与关联数组的区别及常见操作
L1 PHP 中引用传递与值传递的区别
L1 PHP 单引号与双引号字符串的区别
L1 PHP 动态语言特性与静态语言的区别
L2 抽象类与接口的区别及使用场景
L2 PHP 中 Trait 的作用与冲突解决机制
L2 Late Static Binding 是什么及 static:: 与 self:: 的区别
L2 Composer 自动加载机制与 PSR-4 规范
L2 PHP 中 Error 与 Exception 的区别及异常处理最佳实践
L2 PHP 多范式编程与场景选型
L2 什么是依赖注入?它解决了什么问题?
L2 SOLID 设计原则是什么?各原则的核心意图是什么?
L2 PHP 魔术方法是什么?__get/__set/__call 各适用于哪些场景?
L2 PHP 命名空间的解析规则与别名机制
L3 PHP 的垃圾回收机制是如何工作的
L3 PHP zval 内部结构是什么?写时复制(COW)机制如何工作?
L3 WeakReference 与 WeakMap 如何避免引用计数陷阱?
L1 PHP 浮点数精度问题是什么?如何用 bcmath 解决?
L1 PHP 8.0 的 match 表达式与 switch 有什么区别?
L1 PHP 8.0 的 nullsafe 运算符(?->)是什么?与 ?? 有何区别?
L1 PHP 类型强转有哪些方式?各种类型互转的规则是什么?
L1 PHP 8.0 的命名参数(Named Arguments)是什么?有哪些使用场景?
L3 OPcache 编译缓存的工作原理是什么?
L3 PHP JIT 是什么?Tracing 与 Function 两种模式有何区别?
L3 PHP JIT 是什么?Tracing 与 Function 两种模式有何区别?
L1 declare(strict_types=1) 的作用是什么?严格模式与强制模式有何区别?
L1 PHP 的 never 返回类型表示什么?与 void 有何区别?
L1 PHP 的 union types(PHP 8.0)与交集类型(PHP 8.1)有何区别?各自有哪些使用约束?
L3 PHP 请求生命周期的四个阶段
L3 Fiber 与 Generator 有栈协程与无栈协程的本质区别
L3 Fiber 与 Swoole 协程的能力边界对比

更多题目持续产出中,按批次滚动更新。


数据结构与算法篇

难度 频率 题目
L1 算法复杂度分析与 Big-O 表示法
L1 常见数据结构基础操作的时间复杂度是多少?
L1 双指针的两种形式:对撞指针与快慢指针
L1 原地移除数组中的指定元素(快慢指针)
L1 固定大小滑动窗口求子数组最大和
L1 双指针判断回文字符串
L2 链表翻转与 Floyd 环检测
L3 二分查找的统一模板:搜索边界与答案二分
L2 如何合并两条有序链表?
L2 如何用一次遍历删除链表倒数第 N 个节点?
L2 递归三要素是什么?如何分析递归的时间复杂度?
L2 快速排序与归并排序的原理、稳定性和复杂度如何比较?
L2 哈希冲突的解决策略有哪些?如何用哈希表实现 LRU 缓存?
L3 0/1 背包的状态转移方程如何建立?滚动数组如何优化空间?
L3 如何用动态规划求最长公共子序列并还原具体路径?
L3 最长递增子序列(LIS)的 O(n²) 与 O(n log n) 算法有何区别?
L3 记忆化搜索(自顶向下)与自底向上 DP 在实现和性能上有何区别?

操作系统与服务器篇

难度 频率 题目
L1 PHP 开发常用 Linux 命令:文件查找、进程与网络诊断
L2 PHP-FPM 进程模型与 FastCGI 协议
L4 Swoole 协程与 PHP-FPM 的选型决策

架构与分布式篇

难度 频率 题目
L5 短链系统设计:唯一短码生成方案的架构权衡
L4 单体拆分微服务后的分布式事务选型

计算机网络篇

难度 频率 题目
L1 GET 和 POST 请求的区别
L2 HTTPS 的 TLS 握手流程与加密分工
L3 HTTP/2 与 HTTP/3 的核心改进与底层原理
L1 HTTP 缓存机制:强缓存与协商缓存的区别
L1 HTTP 的无状态特性与会话保持方案
L2 TCP 粘包的成因与应用层拆包方案
L2 DNS 解析流程与 CDN 接入原理
L2 IO 模型:同步/异步与阻塞/非阻塞的区别
L2 PHP 网络并发与连接复用策略
L3 epoll 为什么比 select/poll 性能好?IO 多路复用机制对比
L3 epoll 的水平触发(LT)与边缘触发(ET)有什么区别?
L3 Reactor 模式是如何工作的?与多线程模型相比优势在哪?

设计模式篇

难度 频率 题目
L1 设计模式的三大分类与意图
L2 工厂方法与抽象工厂的区别及选型
L3 里氏替换原则的行为契约与继承陷阱

存储与中间件篇

难度 频率 题目
L1 MySQL 中各种 JOIN 的区别是什么?
L1 什么是数据库三范式?各范式分别解决了什么问题?
L1 Redis 有哪五种基本数据类型?各自适用什么场景?
L2 MySQL 索引为什么用 B+ 树?聚簇索引与非聚簇索引有什么区别?
L2 什么是覆盖索引?联合索引的最左前缀原则是什么?
L2 MySQL 四种事务隔离级别与并发问题
L2 缓存穿透、缓存击穿与缓存雪崩的区别及防护方案
L3 ORDER BY 的执行原理与性能优化
L3 MySQL 一条查询语句的完整执行流程

Web 篇

难度 频率 题目
L1 HTTP 常见状态码含义与 301 和 302 的区别
L1 PHP 主流框架对比与选型概览
L2 PHP 框架中间件机制与洋葱模型
L3 Laravel 服务容器(IoC)的实现原理

安全篇

难度 频率 题目
L1 XSS 攻击类型与防御方案
L2 CC 攻击与应用层限流防护方案
L3 PHP 文件上传安全与输入过滤实践

番外篇

难度 频率 题目
L2 生产环境如何排查 Bug,以及如何在本地复现并调试
L3 AI 时代的 PHP 开发者:从工具选择到学习方法论

学习路径

本仓库题目按需自取,以下是几种常见使用方式:

  • 突击准备:按「考察频率 = 高」筛选,优先看 L1-L2 题目
  • 体系进阶:按主题顺序从 L1 读到 L3,建立完整知识链路
  • 查漏补缺:直接翻「追问链」和「易错点」,快速发现认知盲区
  • 模拟面试:遮住答案只看标题,尝试自行组织回答后对照

单题结构说明

每道题遵循统一模板,包含 6 个区块:

┌─────────────────────────────────┐
│  一句话结论(≤30 字核心答案)      │
├─────────────────────────────────┤
│  体系讲解(原理 → 机制 → 结论)   │
│  └── 含 Mermaid 流程图           │
├─────────────────────────────────┤
│  考察意图                        │
├─────────────────────────────────┤
│  追问链(3-5 个递进问题 + 简答)   │
├─────────────────────────────────┤
│  易错点(2-3 个高频误区)          │
├─────────────────────────────────┤
│  代码示例(PHP 8.0+ 可运行)      │
└─────────────────────────────────┘

参与贡献

感谢所有为本项目提交过 PR / commit 的同学(头像由 GitHub 统计生成,点击可查看完整列表):

PHP-Interview-QA contributors

欢迎提 Issue 或 PR,贡献方式包括:

  • 🐛 勘误:发现事实性错误、过时内容或失效链接
  • 💡 新题建议:提议新的面试题目
  • 🔬 查证补充:为标注「需查证」的内容提供权威来源
  • 📊 难度争议:认为某题难度标注不准确
  • 📈 频率争议:认为某题考察频率标注不准确

详细流程请阅读 CONTRIBUTING.md


License

本项目基于 Apache License 2.0 开源。

About

PHP面试问答

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors