变量作用域、数组函数、字符串处理——高频面试问答
本章聚焦 PHP 基础知识的三块核心考点:变量作用域、数组函数和字符串处理。大厂面试中这些题目出现频率极高,且常通过追问考察你对底层原理的理解。以下先给出通用回答框架,再通过三个典型问答卡片拆解得分要点。
问答卡片 1:变量作用域
面试问题:请解释 PHP 中 global、static、local 变量的区别,并说明在函数内部如何访问全局变量。
面试官考察点:
- 是否理解 PHP 变量作用域的基本规则
- 对 global 关键字和 $GLOBALS 数组的底层差异是否清楚
- 能否区分静态变量与普通局部变量
回答框架:定义各作用域 → 代码示例对比 → 访问全局变量的两种方式 → 静态变量的实际用途(如计数器、缓存)。
简短示例回答:local 变量在函数内定义,函数外不可见;global 变量在函数外定义,函数内需用 global 声明或通过 $GLOBALS 访问;static 变量只在首次调用时初始化,并保持值。例如计数器常用 static $count。
可能追问:global 与 $GLOBALS 有什么性能差异?静态变量在递归中如何处理?引用传递是否影响作用域?
避坑提醒:避免将静态变量用于复杂状态管理,容易引入隐式依赖;面试时切勿说“global 就是全局变量”,要区分声明与访问。
问答卡片 2:数组函数
面试问题:如何对数组进行过滤、映射和归约?请写出 array_filter、array_map、array_reduce 的基本用法及区别。
面试官考察点:
- 是否熟练使用 PHP 内置数组函数替代循环
- 对回调函数的参数顺序和返回值类型是否清晰
- 能否在实际场景中组合使用这些函数(如数据处理管道)
回答框架:逐个介绍三个函数 → 展示代码片段 → 对比适用场景 → 指出常见坑点(如 array_map 保留键名问题)。
简短示例回答:array_filter 用回调过滤偶数:array_filter($arr, fn($v) => $v%2===0);array_map 对每个元素平方:array_map(fn($v) => $v*$v, $arr);array_reduce 求和:array_reduce($arr, fn($c,$v)=>$c+$v, 0)。
可能追问:array_filter 不传回调时默认移除空值?array_map 如何处理多个数组?array_reduce 的初始值不传会怎样?
加分提醒:提到这些函数比 foreach 更具表达力且减少临时变量,体现函数式编程思维。
问答卡片 3:字符串处理
面试问题:请比较 str_replace、preg_replace 和 substr 在替换或提取字符串时的异同,并给出一个验证邮箱格式的简单正则。
面试官考察点:
- 是否理解不同字符串函数的性能差异
- 正则表达式的使用熟练度及边界思考
- 能否选出最合适的函数而非总用最强大的
回答框架:分场景比较 → 举例说明各自最佳实践 → 写出 preg_match 验证邮箱 → 提示使用 filter_var 更可靠。
简短示例回答:str_replace 适合简单替换,preg_replace 支持正则(如隐藏手机号中间四位),substr 用于按位置截取。邮箱验证:preg_match('/^[\w\.-]+@[\w\.-]+\.\w{2,4}$/', $email) 但生产多用 filter_var($email, FILTER_VALIDATE_EMAIL)。
可能追问:str_replace 的 count 参数作用?preg_replace 的/e 修饰符为什么废弃?多字节字符串(中文)处理注意什么?
避坑提醒:不要手动写复杂正则验证邮箱,面试中提及 filter_var 表明你了解框架处理方式;区分单字节与多字节函数(strpos vs mb_strpos)。
公司侧重点对照表
| 公司类型 | 变量作用域 | 数组函数 | 字符串处理 |
|---|---|---|---|
| 头部互联网(百度/字节等) | 常结合闭包和匿名函数追问作用域链 | 考察函数式编程组合及性能优化 | 多考察正则回溯安全与边界 |
| 中小型创业公司 | 侧重实际业务中的全局变量管理 | 考察对常见场景的编码效率 | 偏重文本解析、模板替换 |
| 电商/O2O 企业 | 常配合静态缓存变量提问 | 考核数组排序、去重、聚合(如购物车计算) | 考察 JSON 与序列化处理 |
📌 备考建议:将本章三个考点的代码手写一遍,并熟悉 PHP 官方手册中对应函数的注意事项(如引用传参、闭包 use 语法)。面试时主动说出“这个场景我通常使用 xxx 函数,因为它性能更高”,就能拉开差距。