php - 将服务器从 php 5.6 更新到 7.3,出现 PEAR 错误
问题描述
我最近将我的服务器 php 版本从 5.6 更新到了 7.3。当我尝试加载页面时,我看到以下解析错误:
解析错误:语法错误,第 940 行 /usr/share/pear/MDB2/Driver/mysqli.php 中的意外“新”(T_NEW)
上面的文件是通过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 并继续收到上述相同的错误。
解决方案
您的问题在于=&
,应该很简单=
, in $obj =& new ...
。对象不能、不应该、也不需要通过引用来创建。这样的表达式在 PHP 5 中已被弃用,并且在 PHP 7 中无效(请参阅eval
不同 PHP 版本的响应)。
对我来说,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
,默认情况下,两个变量都指向同一个对象(即 to object(stdClass)#1
)。清理这些并给 PEAR 包维护者写一个注释。仅供参考,MDB2_Driver_mysqli软件包最后一次更新是在 2012 年 10 月 23 日,因此获取最新更新不会有太大帮助。寻找最新的替代品。(核心 PHP 自 PHP 5 以来就已mysqli
内置,如果您需要不同 RDBM 之间的代码可移植性,它还具有PDO )。
推荐阅读
- jmeter - jmeter 汇总报告中的总计
- c# - 使用 linq to entity 通过 SQL Query 将值存储到对象的对象中
- smalltalk - SortedCollection 忽略字符串中的大小写
- ruby-on-rails - 如何处理 Trello webhook?RoR API
- c# - 仅显示用户详细信息的用户角色,而不是 mvc asp.net 中其他人的所有详细信息
- ios - 即使我在 iTunes 中有 App Manager 的角色,我也无法添加新的 App
- javascript - 单击输入时滚动到文本末尾
- php - .htaccess 用于平台更改的重定向规则
- mongodb - 查询以获取 MongoDB 中特定键的值
- java - 如何在具有相同 JPanel 内容的不同类中设置两个 JScrollPanes