当我使用匿名函数(但请参见下面的注释)时:
$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(或可能更多)无法管理版本..
答案 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;
};