如何解决将服务器从 php 5.6 更新到 7.3,出现 PEAR 错误
我最近将我的服务器 php 版本从 5.6 更新到 7.3。当我尝试加载页面时,我看到以下解析错误:
解析错误:语法错误,意外的 'new' (T_NEW) in /usr/share/pear/MDB2/Driver/mysqli.php 在线 940
上面的文件是通过pear自动安装的,这里是提示错误的部分:
938
939 $class_name = 'MDB2_Statement_'.$this->phptype;
940 $obj =& new $class_name($this,$statement,$positions,$query,$types,$result_types,$is_manip,$limit,$ offset);
941 $this->debug($query,__FUNCTION__,array('is_manip' => $is_manip,'when' => 'post','result' => $obj));
942 return $obj;
943 }
944
我已经使用 pear upgrade-all 更新了所有 pear 包,重新启动了 httpd 并继续出现上述相同的错误。
解决方法
您的问题在于 =&
,它应该只是 =
,在 $obj =& new ...
中。对象不能,不应该,也不需要通过引用创建。此类表达式在 PHP 5 中已弃用,在 PHP 7 中无效(请参阅对不同 PHP 版本的 eval
响应)。
PEAR 包为什么会有这个对我来说是个谜,它一定是很久以前的遗迹了。它没有比 $x =& [];
更有意义(这也会导致错误)。当一个对象被赋值给一个变量时,这个变量就变成了一个指向该对象的指针。因此:
$a = new stdClass();
var_dump($a);
// object(stdClass)#1 (0) {}
$b = $a;
var_dump($b);
// object(stdClass)#1 (0) {}
var_dump($a === $b);
// bool(true)
即:即使没有赋值$b =& $a
,默认情况下两个变量都指向同一个对象(即指向object(stdClass)#1
)。清理这些并给 PEAR 包维护者写一封便条。仅供参考,MDB2_Driver_mysqli 软件包上次更新是在 2012 年 10 月 23 日,因此获取最新更新无济于事。寻找最新的替代品。 (核心 PHP 从 PHP 5 开始就内置了 mysqli
,如果您需要不同 RDBM 之间的代码可移植性,还有 PDO)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。