3

当我使用匿名函数(但另请参阅下面的注释)时,例如:

$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

4 回答 4

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...
}
于 2014-06-26T16:57:28.293 回答
0

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

因此,对于匿名方法,脚本将遍历所有 PHP 文件,寻找匿名方法:

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

并用 < 5.3 的 create_function 替换它们:

$f = create_function('$a', '
    global $out;
    echo $a . $out;
');
于 2013-05-07T07:54:24.853 回答
0

利用include

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

新函数.php:

        $f = function() use ($out) {
            echo $out;
        };
于 2013-05-07T08:24:55.783 回答
0

匿名函数随PHP 5.3.0.
我要做的第一件事是用以下之一替换:

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

或者

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


更新:

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

于 2013-05-07T07:50:29.513 回答