9

$_GET[test].

これが可能な方法であるかどうかもわからないので、テスト用の短い例を書きました。

echo "Array Test, fields without apostrophe, like \$_GET[fieldname]<BR><BR>";
$a = array();
$a['test'] = "ArrayValue";
echo "case 1 -> \$a['test']: " . $a['test'] . "<BR>";
echo "case 2 -> \$a[\"test\"]: " . $a["test"] . "<BR>";
echo "case 3 -> \$a[test]: " . $a[test] . "<BR>";

そしてそれは機能し、すべての結果が値(ArrayValue)を取得しました。

ケース 2 のようなアクセス方法を好みます。

ケース 3 は、php で許可されている通常のコーディング スタイルですか?

4

3 に答える 3

11

ここで何が起こるかというと、PHPは。という定数を認識しているということtestです。定数が定義されている場合、値が返されますが、定義されていない場合、PHPは文字列にフォールバックします"test"。例えば:

$array = array("A" => "Foo", "B" => "Bar", "C" => "Baz")
define("B", "C");

echo $array[A];   // The constant "A" is undefined, 
                  // so PHP falls back to the string "A", 
                  // which has the value "Foo".
echo $array["B"]; // The result is "Bar".
echo $array[B];   // The value of constant "B" is the string "C".
                  // The result is "Baz".

これは下位互換性のためであり、絶対に使用しないでください。通知をオンにすると、PHPがそれについて文句を言うことがわかります。

于 2012-11-29T09:34:12.097 に答える
5

キーを引用符で囲まないと、未定義の定数として処理され (どこにも定義されていないと仮定)、現時点では機能する可能性がありますが、将来の PHP バージョンでは失敗する可能性があります。したがって、それは単に間違っており、PHP のドキュメントには、この亜種も間違っていると記載されています。「配列の推奨事項と禁止事項」を確認してください。

ちなみに、キーを二重引用符で囲むと、キー名の中に変数が表示されます。

于 2012-11-29T09:29:27.640 に答える
1

引用符なしで配列キー名を使用することは、PHPのレガシー機能です。これは元々それを行う方法でしたが、現在は推奨されておらず、下位互換性のためにのみサポートされています。厳密モードを有効にしている場合は、警告メッセージがスローされます。

これが機能する理由は、この形式のキー名を定数と見なすためです。PHPが不明な定数を検出すると、デフォルトで定数の名前が値として使用されるため、文字列の置換として機能します。

define()プログラムの他の場所にその定数の値を設定していると、問題が発生します。また、キー名にスペースが含まれている場合、数字で始まる場合、またはその他の理由で無効な定数名である場合も機能しません。

これらの理由から、この方法の使用はお勧めしません。

しかし、何よりも、PHP開発者は、これは良い習慣ではないと公に述べています。これは、将来のPHPバージョンでこのようなコードを作成する機能が削除される可能性があることを意味します。

于 2012-11-29T09:33:31.147 に答える