php 5.6迁移关键点:可变参数必须用...显式声明,禁用func_get_args();默认参数仅支持常量或null;assert()中禁止正则字符串,须显式调用preg_match;回调避免隐式$this绑定;e_deprecated默认报错需全面日志排查。

PHP 5.6 的函数使用不是“照着文档抄就行”,尤其在老项目迁移或维护中,function 声明本身没坑,但参数处理、类型隐式转换、错误行为变化才是实际卡点。直接上关键结论:别用 func_get_args() 写新逻辑;所有可变参数必须用 ... 显式声明;默认参数值不能是表达式(如 date('Y-m-d'));assert() 里别放正则字符串。
可变参数必须用 ...,禁用 func_get_args()
PHP 5.6 要求可变参数语义必须在函数签名中显式体现,否则 IDE 无法提示、静态分析失效、类型约束写不了。
-
func_get_args()返回的是运行时数组,PHP 不知道它该是什么类型,array_sum(func_get_args())在严格模式下可能因混合类型触发警告 - 正确写法是
function sum(...$numbers): int—— 这样能加int类型约束,且调用sum(1, 2, '3')会直接报TypeError,而不是后期array_sum报Warning - 如果要兼容 PHP 5.5 或更低版本,宁可封装一层适配器,也不要混用两种风格,否则
phpstan或psalm会反复报错
default 参数值只能是常量或 null
PHP 5.6 不允许在函数声明里用动态表达式作默认值,比如 time()、__DIR__、new DateTime() 都会 parse error。
- 错误写法:
function log($msg, $ts = time()) { ... }→Parse error: syntax error, unexpected 'time' - 正确写法:把计算逻辑移到函数体内,
$ts = $ts ?? time();或者用null占位再判断 - 注意:
__FILE__、__LINE__、数字/字符串字面量、array()是允许的,但[](空数组)在 5.6 中不被接受,得写array()
assert() 里不能写正则字符串,必须显式调用 preg_match
很多老项目习惯写 assert("preg_match('/^\d+$/', \$x)"),这在 PHP 5.6 下不仅失效,还会因 assert() 默认关闭而静默跳过——你以为断言生效了,其实根本没跑。
-
assert()第一个参数是字符串时,PHP 会eval它,但 PHP 5.6+ 默认assert.active = 0,且zend.assertions = -1时连解析都不做 - 真正可靠的写法是:
assert(preg_match('/^\d+$/', $x) === 1),这样无论assert开关如何,逻辑都走正则,且返回值明确 - 如果真要用字符串断言(不推荐),得确保
ini_set('assert.exception', '1')和ini_set('zend.assertions', '1')同时生效,但这在生产环境极易遗漏
回调函数传参别依赖 $this 隐式绑定
PHP 5.6 对匿名函数和 [$obj, 'method'] 形式的回调做了更严格的对象生命周期检查,$this 若在闭包外已被销毁,调用时直接 fatal error。
- 常见陷阱:在循环里写
array_map(function() use ($item) { return $item->id; }, $list),但$item是引用或对象,循环结束后变量已 unset - 安全做法:显式传参,
array_map(fn($i) => $i->id, $list)(5.6 不支持 fn,得用function($i) { return $i->id; }),避免 use 引用外部对象 - 如果必须用对象方法,先确认
is_object($obj) && method_exists($obj, 'method'),别等 call_user_func 触发Fatal error: Call to a member function
最易被忽略的其实是错误报告级别——PHP 5.6 默认把 E_DEPRECATED 设为 error,而很多老项目里 create_function()、mysql_* 调用就藏在函数体深处,不跑一遍根本不知道哪行崩。上线前务必开 error_reporting(E_ALL) 并捕获日志。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











