この記事ではPHPでの変数変数名の使い方を紹介します。変数変数名について一緒に学びましょう。
場合によっては、変数変数名はプログラミングに大きな利便性をもたらします。つまり、変数名に動的に名前を付けて使用することができます。通常、変数は次のようなステートメントによって名前が付けられます:
コードは次のとおりです |
コードをコピー |
$a = 'こんにちは';
?>
|
変数の変数名とは、変数の値を変数の名前として使用することを指します。上記の例では、以下のように 2 つの $ 記号を使用して、変数の名前に hello を設定できます。
コードは次のとおりです
| コードをコピー
|
$$a = '世界';
?>
上記の 2 つのステートメントを通じて、2 つの変数が定義されます。変数 $a には「hello」が含まれ、変数 $hello には「world」が含まれます。 したがって、次の言語:
コードは次のとおりです
コードをコピー |
|
エコー「$a ${$a}」;
?>
は、次のステートメントの出力とまったく同じです:
コードは次のとおりです
コードをコピー
|
|
「$a $hello」をエコーします
?>
| それらはすべて「hello world」を出力します。
配列に変更可能な変数名を使用するには、あいまいさの問題を解決する必要があります。つまり、$$a[1] を記述する場合、パーサーは $a[1] を変数として扱うことを意味するのか、それとも $$a [1] がこの変数を参照することを意味するのかを理解する必要があります。索引。このあいまいさを解決するための構文は、最初のケースでは ${$a[1]} を使用し、2 番目のケースでは ${$a}[1] を使用します。
クラスプロパティには、可変プロパティ名を通じてアクセスすることもできます。変数のプロパティ名は、呼び出しが行われた変数のアクセス スコープから取得されます。たとえば、式が $foo->$bar のような場合、ランタイムはローカル変数スコープで変数 $bar を検索し、その値が $foo オブジェクトのプロパティ名として使用されます。 $bar が配列の場合にも使用できます。
例1 変数変数名
コードは次のとおりです
コードをコピー
|
|
クラス foo {
var $bar = '私はバーです。';
}
$foo = 新しい foo();
$バー = 'バー';
$baz = array('foo', 'bar', 'baz', 'qux');
エコー $foo->$bar ;
エコー $foo->$baz[1]
?>
上記の例は次の結果を出力します:
私はバーです
私はバーです
警告
変数変数名は、PHP 関数およびクラスのスーパーグローバル配列変数には使用できないことに注意してください。変数 $this も、動的に名前を付けることができない特殊な変数です。
PHP 変数の安全性に関する簡単な説明
可変変数はPHPの非常に便利な機能です。マニュアルにも記載されていますが、可変変数とは、変数の変数名を動的に設定できることを意味します。
では、変数の変数名を動的に設定できる場合、どのようなセキュリティ上の問題が発生するのでしょうか?以下をご覧ください:
コードは次のとおりです |
コードをコピー |
$a = 'phpinfo';
$a();
?>
|
このコードは、変数の型を文字 phpinfo() に動的に追加することで、変数が phpinfo 関数となって動的に実行されるというものです。
同じ原則に従って、マニュアルの可変変数の例を引用します:
コードは次のとおりです |
コードをコピー |
$a = 'phpinfo';
${$a()};
?>
$a() |
この動的関数は動的変数に入れられますが、これはまだ変数変数であることがわかります。
マニュアルと私が挙げた例を読んだことがある方なら、これはまったく魔法ではないことが分かるでしょう。これは PHP の文法上の特徴です。次に、これをさらに進化させて 1 行にまとめます。
コードは次のとおりです
| コードをコピー
|
$a = "${${phpinfo()}}";
?>
これは上の例に従って変数の内容を自分で埋めただけで、ある関数をある変数に割り当てたので、最終的に phpinfo 関数が実行されました。さまざまな脆弱性とWebシェルのプロトタイプ!
これを読めば、専門家が私に PHP マニュアルを読むよう指示した理由がわかるはずですが、専門家はセキュリティが基礎であると述べています。前の例では変数が一重引用符を使用しているのに対し、最後の例では二重引用符が使用されている理由を見てみましょう。この問題について考えると、セキュリティ面でも同様の可能性があると確信します。未来の大きな牛!
PHP における一重引用符と二重引用符の違いは、依然として変数に関連しています。次の例を見てみましょう。
コードは次のとおりです
コードをコピー |
|
$a = 'phpinfo()';
echo $a; // phpinfo() 文字列を出力します
echo '$a' // $a 文字列を出力します
echo "$a"; // phpinfo() 文字列を出力します
?>
|
二重引用符で囲まれた内容は PHP の構文変数によって解析され、一重引用符で囲まれた内容は文字列として直接修飾されます。
この記事はここで本当に終わります。なぜ偉い人たちが私に PHP マニュアルをもっと読むように、そして安全が基礎であると言ったのはなぜなのか、誰もが理解できるはずです。
http://www.bkjia.com/PHPjc/632705.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/632705.html技術記事この記事では、PHPでの変数変数名の使い方を紹介します。変数変数名について一緒に学びましょう。 変数変数名が編集される場合があります...
|