XAMPP报错'Only variables' 调整error_reporting隐藏PHP严格语法警告
PHP5.4+禁止将函数返回值直接传给需引用参数的数组函数(如end、reset),该错误属E_STRICT级别。修改代码是唯一正确做法,调整error_reporting只能临时掩盖。常见错误写法:$ext=end(explode('.',$filename));正确写法:先赋值给变量再调用函数。PHP7.4+会直接报致命错误。定位时可检查报错堆栈中的文件
这个报错,本质上是PHP 5.4及以后版本引入的一项规则:函数返回值不能直接传递给需要引用传递的数组函数(如end、reset)。它属于E_STRICT级别的警告。解决办法只能修改代码,不能通过调整error_reporting来规避。

需要明确的是——这个问题并非XAMPP所致,而是PHP 5.4+对函数返回值引用传递的限制被触发。因此,绝不要试图通过降低error_reporting来掩盖问题,必须修改代码。
为什么error_reporting(E_ALL & ~E_NOTICE)不起作用
原因在于该错误属于E_STRICT级别,自PHP 5.4起已被纳入E_ALL。默认情况下E_STRICT并未启用,但如果配置中显式开启(例如框架内写了error_reporting(E_ALL | E_STRICT)),该警告就会显示。仅使用~E_NOTICE无法屏蔽E_STRICT。
error_reporting(E_ALL & ~E_NOTICE)仍会显示E_STRICT- 正确写法应为
error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT)(不推荐) - 更常见的情况是:某些CMS(如旧版Drupal、Joomla)或自定义函数中使用了类似
end(explode('/', $path))的写法,PHP不允许将函数返回值直接传递给需要引用参数的函数
end()、reset()、current()等数组指针函数不能直接套用函数返回值
这是最常见的触发场景:试图对临时数组结果直接调用指针操作函数。但这些函数要求传入一个变量,而非表达式计算结果。简单来说,必须提供一个“变量容器”,不能是“临时结果”。
- 错误写法:
$ext = end(explode('.', $filename)); - 正确写法:
$parts = explode('.', $filename); $ext = end($parts); - 其他函数同理:
reset()、prev()、next()、key()都受此限制 - 注意:PHP 7.4+ 开始,此类写法会直接抛出
Fatal error,不再只是警告
如何快速定位问题代码
如何查找?报错信息通常只提供文件名和行号,不会指明具体嵌套调用。关键是要查看报错堆栈中最后一行是否来自您自己的.php文件,然后检查该行是否使用了上述数组指针函数。
- 打开XAMPP控制面板 → Apache → Config → PHP(php.ini)→ 搜索
error_reporting,确认当前值(通常为E_ALL) - 在报错页面右键查看源代码,找到
Warning: Only variables should be passed by reference附近的真实行号 - 如果使用IDE,可在项目中全局搜索
end(、reset(、current(,逐一检查括号内是函数调用还是变量 - 临时添加一行
ini_set('error_reporting', E_ALL & ~E_STRICT);可以验证是否为该级别引发——但仅用于排查,不可长期保留
真正需要修改的是代码中将函数返回值当作变量使用的写法。仅靠修改error_reporting只是掩耳盗铃,一旦程序部署到更高版本PHP环境下,随时可能崩溃。
