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 ステートメントが true として評価されることはありませんが、無名関数呼び出しは 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';

function53.php は 5.2 ユーザーにはロードされないため、これで問題なく動作します。ただし、個別のファイルを使用する必要があるのは理想的ではありません。

アレスの質問へのコメントを読んだ後、次のようになります。

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

動作しないでしょう。PHPのコンパイラは、コンパイル時に両方のファイルを実行して、実行前に構文エラーをチェックし、回避しようとしているエラーをスローします。ファイル メソッドが機能する唯一の方法は、バージョン番号に基づいてファイルを動的に選択することです。これには、PHP 4 および 5 からの xy リリースごとに個別のファイルが必要です。理想的ではありません。

アレックスの答えでは、うまくいきます。提案された大量のファイルに対して、1 行の 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コードを追加することはできず、ファイルを含めたくないのでcreate_function()、コードを文字列として配置する場所を使用する方法があります。これもきれいではありませんが、あなた。

于 2013-06-24T12:49:23.480 に答える
2

機能ごとに、1 つの関数またはクラスを定義します。これらのバージョン固有の違いが必要な場合は、バージョンごとに 1 つのファイルを作成します。例えば:

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()。または、呼び出す必要があるときに機能がサポートされているかどうかを確認してください。

if (function_exists('foo'))

または定数を設定します。

if (FEATURE_FOO_AVAILABLE) {
    foo();
}
于 2013-06-24T13:01:30.700 に答える
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 を使えば簡単です。彼のファイルには大きく重複する領域があるため、単純に 2 つの別個のファイルを作成するのではなく、ファイルの途中にある 2 つの別個のコード セクションを何度も実行する方法が必要です。

于 2013-06-24T12:36:40.553 に答える