5

重要な注意:$GLOBALS汚いと悪です。それらを使用しないでください。これまで。これまでにない。そもそもなぜこれを行うのかではなく、機能しないという事実に
注目してください。これは純粋に技術的な演習に関する理論的な問題です。

これはかなり奇妙なものです。という名前の文字列を使用して可変 variable を作成しようとしています$GLOBALS

グローバルスコープから

var_dump()これをグローバルスコープで実行すると何が得られるか見てみましょう。

$g = sprintf('%s%s%s%s%s%s%s', chr(71), chr(76), chr(79), chr(66), chr(65), chr(76), chr(83));
var_dump($$g);

結果は、ここで確認できるグローバル変数の配列です。すごい!それでは、関数でこれを試してみましょう。

関数スコープから

$GLOBALSまず、関数内で実際にチェックを実行できることを確認しましょう。

function globalAllTheThings()
{
    var_dump($GLOBALS);
}

globalAllTheThings();

結果は次のとおりですこれはここで見ることができます。

それでは、関数内のグローバル スコープで使用した最初のテストを試して、何が起こるか見てみましょう。

function globalAllTheThings()
{
    $g = sprintf('%s%s%s%s%s%s%s', chr(71), chr(76), chr(79), chr(66), chr(65), chr(76), chr(83));
    var_dump($$g);
}

globalAllTheThings();

簡単にするために

奇妙な難読化なしでこれを試すこともできます(聞かないでください)。

function globalAllTheThings()
{
    $g = 'GLOBALS';
    var_dump($$g);
}

globalAllTheThings();

返しNULLます。それは何ですか?? が返される理由NULLと、これを機能させるにはどうすればよいですか。なぜ聞くの?もちろん、教育目的のために、そして科学のために

すべてのもの、SRSLY

4

1 に答える 1

4

マニュアルにそう書いてあるので:

警告

変数変数は、関数またはクラス メソッド内の PHP のスーパーグローバル配列では使用できないことに注意してください。この変数$thisは、動的に参照できない特殊な変数でもあります。

http://php.net/manual/en/language.variables.variable.php

まさに「特別」です。PHPは「特別」です。スーパーグローバルは、そもそも通常の変数と同じルールでは機能しません。誰かが、関数内の可変変数と互換性を持たせるのを忘れたか、そうしないことに決めました。限目。

于 2013-08-13T09:55:10.913 に答える