4

所以我现在的目标是检测用户的 PHP 版本(不是问题),然后根据它运行 if else

所以如果我写这样的东西:

if (PHP => 5.3){
// call a function anonymously
}
else {
// if user does not have 5.3, this else block disables the feature. 
}

我遇到的问题是,如果用户有 5.3 或更高版本(因为它们是在 PHP 5.3 中引入的),我想使用 PHP 的匿名函数,如果他们有旧版本,我想使用替代方法。当然,问题是,如果用户使用 PHP 5.2.17,虽然该 if 语句永远不会评估为真,但会抛出一个致命的语法错误,因为匿名函数调用看起来像 PHP 的语法错误5.2.17

有没有办法做类似上述的事情?我发现的唯一解决方法是将 if 中的内容放在一个新文件中,将 else 中的内容放在另一个文件中,然后执行以下操作:

$version = '5.2';//user's current version cut to the nearest x.y, ex 5.3, 5.4, 5.5
// Remove the period here, so we have 5.2
require 'function'.$version.'.php';

现在这将正常工作,因为永远不会为 5.2 用户加载 function53.php。但是,必须使用单独的文件并不理想。

在阅读了对 Ales 问题的评论后,是这样的:

if ($version > '5.3'){
// require one file
}
else{
// require another
}

不管用。PHP 的编译器将在编译时运行这两个文件,然后在执行前检查语法错误并抛出我试图避免的错误。文件方法起作用的唯一方法是根据版本号动态选择文件。对于 PHP 4 和 5 的每个 xy 版本,这需要一个单独的文件。不理想。

在亚历克斯的回答中,它工作正常。我们说的是一行 eval(需要隐藏匿名函数调用),而不是建议的大量文件。

4

3 回答 3

3
$version = explode('.', PHP_VERSION);
if ($version[0] > 5 || ($version[0] == 5 && $version[1] >= 3)) {
    //include with anonymous functions
    include 'file1.php';
} else {
    //include alternatives
    include 'file2.php';
}

对不起,我下面的代码是错误的-.-

由于您不能直接在代码中添加 php5-code 并且您不想包含文件,因此有一种方法可以使用create_function()将代码作为字符串放置的位置,这也不是很漂亮,但可以完成这项工作你。

于 2013-06-24T12:49:23.480 回答
2

您可以只评估代码,它可以即时编译。

$res = -1
if (PHP => 5.3){
    eval('$res = [some advanced PHP 5.3 fast code]');
}
else {
    $res = [some basic PHP 4 code still supported by 5.3, just deprecated];
    eval('$res = [some real rudimentary PHP 4 code no longer supported at all in 5.3]');
}
$res = $res + 1;
echo $res;

if (PHP => 5.3){
    eval('$res = [some more advanced PHP 5.3 fast code]');
}
else {
    $res = [some more basic PHP 4 code still supported by 5.3, just deprecated];
    eval('$res = [some more real rudimentary PHP 4 code no longer supported at all in 5.3]');
}

看看以这种方式包含 50 个不同的文件是多么痛苦,但是 eval 让它变得容易了吗?他的文件中有很多重叠的区域,所以他不想仅仅创建两个单独的文件,所以他想要一种方法来多次运行文件中间的两个单独的代码部分。

于 2013-06-24T12:36:40.553 回答
2

对于每个特性,定义一个函数。如果您需要这些版本的特定差异,请为每个版本创建一个文件。例如:

features_5.3.php

function foo() { ... }

function bar() { ... }

features_5.2.php

function foo() { ... }

function bar() { ... }

然后检查一次您正在运行的版本并包含适当的文件:

if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
    require_once 'features_5.3.php';
} else {
    require_once 'features_5.2.php';
}

然后在需要的地方使用您的功能:

foo();

对于不支持这些功能的 PHP 版本,只需执行foo()no-op;或者在需要调用该功能时检查是否支持该功能:

if (function_exists('foo'))

或设置常量:

if (FEATURE_FOO_AVAILABLE) {
    foo();
}
于 2013-06-24T13:01:30.700 回答