8

PHPでは、アクサングラーブでラップされた文字列に等しい変数をセットに書き込むと、コマンド内にある場合と同じように実行されshell_exec()ます。PHPでは、アクサングラーブ記号( `)(一重引用符ではありません)は何を表していますか?

したがって、phpでは、文字列を変数などと組み合わせるためにあらゆる種類のことを行うことができます。「」または「」の代わりに「」を使用すると、何ができ、何ができなくなりますか?

4

1 に答える 1

9

PHPでは、その文字はバッククォート演算子と呼ばれます。

バッククォートでラップされたリテラル文字列はT_ENCAPSED_AND_WHITESPACEトークンです。これは、次のように実行することで確認できます。

print_r(token_get_all('<?php `uname`;'));

これはあなたにこれを与えます:

Array
(
    [0] => Array
        (
            [0] => 367
            [1] => <?php 
            [2] => 1
        )

    [1] => `
    [2] => Array
        (
            [0] => 313
            [1] => uname
            [2] => 1
        )

    [3] => `
    [4] => ;
)

そして、token_name(313)あなたに与える実行T_ENCAPSED_AND_WHITESPACE

パーサーにとって、バッククォートでラップされた文字列は、のような変数を含む文字列と同等"hello $world"です。文字列のリテラル/定数部分(hello部分)はT_ENCAPSED_AND_WHITESPACEです。

したがって、質問に答えるために、変数を含む文字列に対して実行できることはすべて、バッククォートでラップされた文字列に対して実行できます。

では、なぜT_ENCAPSED_AND_WHITESPACEですか?おそらく、変数を含む文字列のように、その値は実行時に決定されるためです。一方、T_CONSTANT_ENCAPSED_STRING(通常のリテラル文字列)は、パーサーの目には定数のようなものです。

于 2012-05-30T18:46:39.993 に答える