XAMPP报错'Only variables' 调整error_reporting隐藏PHP严格语法警告

作者:技术拾光时间:2026-06-20 10:24:19浏览:631

PHP5.4+禁止将函数返回值直接传给需引用参数的数组函数(如end、reset),该错误属E_STRICT级别。修改代码是唯一正确做法,调整error_reporting只能临时掩盖。常见错误写法:$ext=end(explode('.',$filename));正确写法:先赋值给变量再调用函数。PHP7.4+会直接报致命错误。定位时可检查报错堆栈中的文件

这个报错,本质上是PHP 5.4及以后版本引入的一项规则:函数返回值不能直接传递给需要引用传递的数组函数(如end、reset)。它属于E_STRICT级别的警告。解决办法只能修改代码,不能通过调整error_reporting来规避。

XAMPP报错'Only variables' 调整error_reporting隐藏PHP严格语法警告

需要明确的是——这个问题并非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环境下,随时可能崩溃。