2012-11-29 5 views
6

私は、既存のPHPソースである の現象に、$ _GET [test]のようなアポストロフィを付けずにフィールドにアクセスしてノックしました。 (ArrayValue)引用符のないPHP配列のアクセス

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>"; 

そしてそれはすべての結果が値を持って、作品:

私はこれが可能な方法であること、また、知らない、わからないだ、 はので、私はテストのために簡単な例を書きました。

私は2

場合と同様のアクセス方法を好むは、PHPの通常、許可されるコーディングスタイルケース3か?

+1

未定義の定数を使用すると警告が表示され、文字列として扱われます。しかし、いいえ、これは "許可され​​たコーディングスタイル"ではありません。 –

+0

あなたの答えをありがとう!私は警告をスローしないApacheログをチェックしました(php.ini:error_reporting = E_ALL&〜E_DEPRECATED; phpinfo:22527)。これは良いスタイルではないことを聞いてうれしい! – Peter

答えて

7

ここでは、testと呼ばれるa constantが表示されます。定数が定義されている場合は値が返され、定義されていない場合、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". 

これは下位互換性のためであり、使用しないでください。 turn on noticesにお越しいただければ、PHPがそれについて不満を表明します。

4

キーを引用符で囲まないと、未定義の定数として扱われます(どこにも定義されていないと仮定して)。これは現在は動作しますが、将来のPHPバージョンでは失敗する可能性があります。そのため、それは間違っているだけであり、PHPのマニュアルではこの変形も間違っていると述べています。 「Arrays do's and don'ts」をチェックしてください。

ところで、キーを二重引用符で囲むと、キー名に変数が表示されます。

1

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

これは、この形式のキー名が定数として認識されるためです。 PHPが未知の定数を見ると、デフォルトで値の定数の名前になります。したがって、文字列の置換として機能します。

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

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

しかし、ほとんどのPHP開発者は、それが良い習慣ではないことを公然と表明しています。将来のPHPバージョンでは、このようなコードを書く能力がなくなる可能性があります。