PHP - 如何避免在使用新功能时解析旧服务器上的错误

时间:2013-05-07 07:34:05

标签: php version compatibility parse-error

当我使用匿名函数(但请参见下面的注释)时:

$f = function() use ($out) {
                echo $out;
            };

它在PHP早于5.3.0的服务器上产生解析错误。 我的软件需要与未知服务器兼容,但同时我也想使用新功能,所以我想我会添加一些版本检查,

if (o99_php_good() != true){
            $f = function() use ($out) {
                echo $out;
            };
        }

o99_php_good()只是

function o99_php_good(){
    // $ver= ( strnatcmp( phpversion(),'5.3.0' ) >= 0 )? true:false;
    $ver= ( version_compare(PHP_VERSION, '5.3.0') >= 0 )? true:false;
return $ver;
}

但仍然会产生错误。

有没有办法以某种方式“隔离”代码的那一部分?

我想过根据版本检查做一个条件include(),这可能会起作用,但是每次我需要使用一个函数时创建一个单独的文件是荒谬的......

任何有创意(或琐碎)的解决方案?

注意:这里的示例只是一个Lambda函数,但问题可能发生在每个其他函数中,这是一个新功能和/或某些服务器可能不支持..

评论后

编辑我

添加“最低要求”列表总是好的,但它无法解决问题。

如果一个人不想让用户失望(并非所有客户都满意,或者每次更新新功能都可以升级他们的服务器),那么它只会迫使我将我的软件“分叉”为2(或可能更多)无法管理版本..

4 个答案:

答案 0 :(得分:1)

我有完全相同的问题并使用eval函数解决了它:

if (version_compare(PHP_VERSION, '5.3.0') >= 0) {
eval('
function osort(&$array, $prop)
{
    usort($array, function($a, $b) use ($prop) {
        return $a->$prop > $b->$prop ? 1 : -1;
    }); 
}
');
} else {
    // something else...
}

答案 1 :(得分:0)

PHP 5.3.0附带匿名函数。 我要做的第一件事就是用下列之一取代:

$my_print_r = "my_print_r";
$my_print_r();

$my_print_r = create_function('$a','print_r($a);');


更新:

我会选择第一种方法 ...它会给我足够的控制来创建我自己的函数版本,并且比create_function更简单的程序,无论 PHP版本。我从来没有遇到任何问题。事实上,我曾经构建了一个完整的多维函数数组,它易于管理,能够添加/删除函数,想到这一点。该系统也被其他用户使用,他们能够添加他们的功能也是某种方式。

答案 2 :(得分:0)

我唯一能想到的是创建一个构建脚本,人们必须运行它才能使它与较低版本兼容。

因此,在匿名方法的情况下,脚本将循环遍历所有PHP文件,寻找匿名方法:

$f = function($a) use($out) {
    echo $a . $out;
};

并将其替换为create_function for< 5.3:

$f = create_function('$a', '
    global $out;
    echo $a . $out;
');

答案 3 :(得分:0)

使用include

if (o99_php_good() != true){
include 'new_func.php';
        }

new_func.php:

        $f = function() use ($out) {
            echo $out;
        };