0

すべてが宣言され、初期化され、PHPでわかりやすい構文を使用するグローバル変数の設定を使用したいので、次のアイデアを思いつきました。

<?
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

$GLOBALS['debugger'] = 1;                   // set $GLOBALS['debugger'] to 1 
DEFINE('DEBUGGER','$GLOBALS["debugger"]');  // friendly access to it globally

echo "1:" . DEBUGGER . ":<br>";
echo "2:" . ${DEBUGGER}. ":<br>";
echo "3:" . $GLOBALS['debugger'] . ":<br>";
if (DEBUGGER==1) {echo "DEBUG SET";}
?>

以下を生成します。

1:$ GLOBALS ["debugger"]:

注意:未定義の変数:8行目の/home/tra50118/public_html/php/test.phpの$ GLOBALS["debugger"]

2 ::

3:1:

$GLOBALS["debugger"]明確に定義されている場合、2:でエラーが発生する可能性はありますか?そして、10行目のテストで同様の通知を生成しませんか?

私がやろうとしているのは$GLOBALS["debugger"]、実行時に文字列()を変数、つまり定数変数変数として解釈するようにPHPに強制することだと思います。

4

4 に答える 4

1

免責事項:コメントに同意します。グローバルは一般的に悪い考えです。

とはいえ、ここには答える価値のあるいくつかの質問があり、間接化の概念は便利なので、ここで説明します。

${'$GLOBALS["debugger"]'}未定義です。'$'インダイレクションを使用する場合は、先頭を含めません。したがって、正しいバージョンはdefine('DEBUGGER', 'GLOBALS["debugger"]').

しかし、これもうまくいきません。インダイレクション経由で 1 レベル下にしかアクセスできません。したがって、配列$GLOBALSにはアクセスできますが、その配列内のキーにはアクセスできません。したがって、次を使用できます。

define('DEBUGGER', 'debugger');
${DEBUGGER};

これは実際には役に立ちません。$debuggerグローバルとして定義されており、どこでも使用できるため、直接使用することもできます。global $debugger;ただし、関数の開始時に定義する必要がある場合があります。

if ステートメントが通知を引き起こしていない理由はDEBUGGER、文字列になるように定義したためです。その行では間接化をまったく使用しようとしないため、最終的には次のようになります。

if ("$GLOBALS['debugger']"==1) {echo "DEBUG SET";}

これは完全に有効な PHP コードですが、明らかに決して真実ではありません。

于 2012-05-08T05:02:33.743 に答える
0

配列またはメソッド内で使用する場合は、$GLOBALS を含むスーパーグローバル配列で「変数変数」を使用することはできません。動作を取得するには、$$ を使用する必要がありますが、これは前述のように機能しません。

PHPの定数はすでにグローバルであるため、これがあなたの例から何を買うのか、何をしようとしているのかわかりません。

定数を文字列に設定しているため、最後の比較は「機能」し、PHPの型キャストを使用して文字列を整数と比較することができます。もちろん、これは false と評価されますが、実際に機能することを期待していたので、驚くかもしれません。

于 2012-05-08T05:09:48.427 に答える
0

定数が少し交差している可能性があると思います。

DEFINE('DEBUGGER','$GLOBALS["debugger"]');定数DEBUGGERstring $GLOBALS["debugger"]に設定します。
これは値でも参照でもなく、単なる文字列であることに注意してください。

これらの結果の原因:

1: 文字列を出力します。 $GLOBALS["debugger"]
2: という名前の変数の値を出力します$GLOBALS["debugger"]。これは " $GLOBALS["debugger"]" という名前の変数であり、配列内のキー "debugger" の値ではないことに注意してください$GLOBALS。したがって、その変数は定義されていないため、警告が発生します。
3: 実際の値を出力する$GLOBALS["debugger"]

うまくいけば、それはすべて理にかなっています。

于 2012-05-08T04:55:49.597 に答える
0

OK、回答してくれたすべての人に感謝します。私は今それを理解していると思います.C++のバックグラウンドから来たPHPは初めてで、定義をC++のように扱い、#defineプリコンパイル/実行フェーズで文字列の置換を行っただけだと想定していました。

正確には、次のようなものを使いたかっただけです

DEBUGGER = 1;

それ以外の

$GLOBALS['debugger'] = 1;

正当な理由がたくさんあります。そのうちの少なくとも 1 つは、単純なタイプミスがあなたを詰まらせるのを防ぎます。残念ながら、これは PHP では実行できないようです。助けてくれてありがとう。

于 2012-05-08T11:02:18.677 に答える