php7/pear 在需要文件时显示解析错误

Jos*_*osh 1 php pear php-7

我有一个遗留站点(不是我写的),过去几年一直在带有 php5 的服务器上。我正在创建一个带有 php7 的新服务器,并测试哪些功能有效,哪些功能被破坏。

该网站通过包含文件来使用 pear pear/lib/DB.php。我创建了一个全新的页面,只有代码

<?php

require_once( "DB.php" );

?>
Run Code Online (Sandbox Code Playgroud)

这呈现与完整站点完全相同的错误。

出现的错误是

PHP Parse error:  syntax error, unexpected 'new' (T_NEW) in /local/sites/php/pear/lib/DB.php on line 310
Run Code Online (Sandbox Code Playgroud)

该网站只需要 DB.php 因为我已将 Pear 添加到 php.iniinclude_path

检查 Pear 的版本给我以下 $ pear 版本

PEAR Version: 1.10.3
PHP Version: 7.0.15-0ubuntu0.16.04.4
Zend Engine Version: 3.0.0
Running on: Linux cdc-migration-0d 3.13.0-103-generic #150-Ubuntu SMP Thu Nov 24 10:34:17 UTC 2016 x86_64
Run Code Online (Sandbox Code Playgroud)

根据我的研究,最新版本的 Pear 与 php7 兼容,因此这些应该可以一起工作。知道为什么仅仅DB.php在测试页面上要求 就会立即生成解析错误吗?

编辑:产生错误的 pear 文件中的代码如下

function &factory($type, $options = false)
    {
        if (!is_array($options)) {
            $options = array('persistent' => $options);
        }

        if (isset($options['debug']) && $options['debug'] >= 2) {
            // expose php errors with sufficient debug level
            include_once "DB/{$type}.php";
        } else {
            @include_once "DB/{$type}.php";
        }

        $classname = "DB_${type}";

        if (!class_exists($classname)) {
            $tmp = PEAR::raiseError(null, DB_ERROR_NOT_FOUND, null, null,
                                    "Unable to include the DB/{$type}.php file",
                                    'DB_Error', true);
            return $tmp;
        }

                @$obj =& new $classname; // ##### this is line 310 that generates the error #####

        foreach ($options as $option => $value) {
            $test = $obj->setOption($option, $value);
            if (DB::isError($test)) {
                return $test;
            }
        }

        return $obj;
    }
Run Code Online (Sandbox Code Playgroud)

Maa*_*aar 5

@$obj =& new $classname;
Run Code Online (Sandbox Code Playgroud)

自 PHP 5.3 起,不推荐通过引用分配 new 的返回值。http://php.net/manual/en/migration53.deprecated.php

这是 PHP4 的 PHP 编写风格。

改为写:

$obj = new $classname; 
Run Code Online (Sandbox Code Playgroud)

从 PHP7 开始这已被删除。

请参阅:http ://php.net/manual/en/migration70.inknown.php#migration70.inknown.other.new-by-ref