PHP eval()関数

eval parsing php
PHP eval()関数

PHP関数eval()は、かなり興味深い関数のようです。 誰かがこの特定の状況でなぜ機能するのかをオンラインで説明できますか?14

function Parse($inFrontEnd)
{
    // Now create an array holding translation tokens with some from above
    // Load translation table into buffer
    $tableLines = file(Utilities::GetRelativePath(TTABLE_DIR).TTABLE); // Array of lines from TTable.cfg
    // Explode by whitespace
    foreach($tableLines as $aLine)
    {
        $lineParts = EXPLODE(' ', $aLine);
        $word = "/".$lineParts[0]."/";
        $definition = $lineParts[1];
        // Add key (word) => value (definition) to array
        // Eval() to return value of the const
        Main::$translateChars[$word] = eval("return $definition;");
    }
    // Read data from template file
    $parseArray = file($inFrontEnd); // Load FrontEnd source code into array ready for parse
    /* Perform the translation of template by the translation table defined data */
    $parseArray = preg_replace(array_keys(Main::$translateChars), array_values(Main::$translateChars), $parseArray);
    return $parseArray;
}

ここで私がやっていることは、テンプレートディレクトリからテンプレートを読み込むことです。 templatename.phpファイルは、定数のように記述されたテキストトークンで構成されます。このトークンは、正規表現によって変換され、トークンが名前の定数を保持するデータに置き換えられます。表示します。 これにより、多くのWebページ(テンプレート)でこれらのトークンを再利用できるため、ページを非常に動的にできます。

私の質問は次のとおりです。eval()を使用する行でしばらく問題がありました。 私がしようとしていることは、各キーが読み込まれた定数の名前である配列、私が名前を付けたもの、各トークンと定数の名前を保持する変換テーブル(TTable.cfg)で配列を埋めることですそれに関連付けられている:

TITLE TITLE + CSS_INCLUDE CSS_INCLUDE + SHOW_ALL_POSTS SHOW_ALL_POSTS
…​

プロトコル[トークン] [定数] [CR] [LF]

配列内のキーは正常に作成されますが、キーを関連付けると、値はnullを返すか、コードを中断します。constant($ definition);宣言されている定数を見つけることができないと不平を言いました。 ただし、この行にあるようにevalを使用すると、各キーはeval( “return $ definition;”);に関連付けられます。それは私が望むように動作します-対応する定数のデータとしての値。

この投稿の長さについて謝罪します。 私が見つけたケース以外に私の質問の他の例を見つけることができませんでした。

  0  2


ベストアンサー

変数 $ definition`の値は、二重引用符を使用しているため、文字列定義 “return $ definition;” に置き換えられます。 したがって、evalに渡されるものは次のような重要なものです。 “return FOO;” 、ここで FOO`は変数$ definitionの値です。

現在、そのコードは eval()`を使用して評価され、結果は評価の結果として返されます。これは定数 `FOO(反復ごとに異なる)の値です。

この場合に「定数」を使用する方が理にかなっています。高速で、潜在的に安全で、読みやすいです。

if ( defined( $definition ) ) {
    $constval = constant( $definition );
}
else {
    $constval = $definition;
}

また、これにより、 `constant()`だけでなく、 `eval()`を使用するときになぜ機能するのかについての洞察が得られます。 PHPは、未知の定数をそれぞれの名前に置き換えます。したがって、evalは機能します。 ただし、他の方法では警告が発生し、読者に何が起こっているかが明確にならないため、悪い習慣になります。

2


「eval」は悪であるため、回避できる場合は使用しないでください。 ここでは、代わりにhttp://php.net/constant [constant]を使用できます。

1


最も小さな見落とし。 変換テーブルの各行から$ definitionを展開した後、$ definitionを消去するのを忘れました。 そのため、単純なtrim()で問題を解決しました。

   constant($definition);

今動作します。

クレイジー:D

0


タイトルとURLをコピーしました