变量作用域、数组函数、字符串处理——高频面试问答

本章聚焦 PHP 基础知识的三块核心考点:变量作用域、数组函数和字符串处理。大厂面试中这些题目出现频率极高,且常通过追问考察你对底层原理的理解。以下先给出通用回答框架,再通过三个典型问答卡片拆解得分要点。

PHP 基础知识回答框架 变量作用域 数组函数 字符串处理 global / local static array_map array_filter array_reduce str_replace preg_match explode 回答思路:先说概念 → 举代码示例 → 对比区别 → 说出实际场景 (先考点、再细节、最后落地)

问答卡片 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 函数,因为它性能更高”,就能拉开差距。