2012-11-29 29 views
6

Ich klopfte auf ein Phänomen in einer vorhandenen PHP-Quelle, mit Feldzugriff ohne Apostroph wie folgt: $ _GET [test].PHP-Array-Zugriff ohne Anführungszeichen

Ich habe nicht sicher, ich weiß auch nicht, dass dies ein möglicher Weg ist, so schrieb ich ein kurzes Beispiel für die Prüfung:

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

Und es funktioniert, bekam jedes Ergebnis den Wert (ArrayValue) .

Ich ziehe die Zugriffsmethode wie Fall 2.

Ist Fall 3 eine normale, erlaubt Codierstil in php?

+1

Ich erinnere mich daran, eine Warnung erhalten, wenn undefined Konstanten verwenden, und es wird als Zeichenfolge behandelt. Aber nein, das ist kein "erlaubter Codierungsstil". –

+0

Danke für Ihre Antwort! Ich habe die Apache-Logs überprüft, die keine Warnung ausgeben (php.ini: error_reporting = E_ALL & ~ E_DEPRECATED; phpinfo: 22527). Freut mich zu hören, dass das kein guter Stil ist! – Peter

Antwort

7

Was hier passiert, ist, dass PHP sieht a constanttest genannt. Wenn die Konstante definiert ist, wird der Wert zurückgegeben, er ist nicht definiert, PHP greift auf die Zeichenfolge "test" zurück. Zum Beispiel:

$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". 

Es ist für Rückwärtskompatibilität und Sie sollten es nie verwenden. Wenn Sie turn on notices sehen, werden Sie sehen, dass sich PHP darüber beschwert.

4

Wenn Sie den Schlüssel nicht in Anführungszeichen setzen, wird er als undefinierte Konstante behandelt (vorausgesetzt, er ist nirgendwo definiert), was zunächst funktionieren kann, aber in zukünftigen PHP-Versionen fehlschlagen kann. Deshalb ist es einfach falsch und die PHP-Dokumentation gibt diese Variante auch als falsch an. Schauen Sie sich 'Arrays do's and don'ts' an.

Übrigens: Wenn Sie den Schlüssel in doppelte Anführungszeichen setzen, rendert es Variablen innerhalb des Schlüsselnamens.

1

Verwenden von Array-Schlüsselnamen ohne Anführungszeichen ist eine ältere Funktion in PHP. Es war ursprünglich der Weg, aber es wird nicht mehr empfohlen und wird nur noch aus Gründen der Abwärtskompatibilität unterstützt. Wenn der strikte Modus aktiviert ist, wird eine Warnmeldung ausgegeben.

Der Grund dafür ist, dass es den Schlüsselnamen in dieser Form als Konstante sieht. Wenn PHP eine unbekannte Konstante sieht, wird standardmäßig der Name der Konstante als Wert verwendet, daher funktioniert es als String-Ersetzung.

Es würde brechen, wenn Sie define() woanders in Ihrem Programm hätten, die den Wert dieser Konstante festlegen. Es funktioniert auch nicht, wenn Ihr Schlüsselname Leerzeichen enthält, mit einer Ziffer beginnt oder aus irgendeinem anderen Grund ein ungültiger Konstantenname ist.

Aus diesen Gründen wird die Verwendung dieser Methode nicht empfohlen.

Aber vor allem haben die PHP-Entwickler öffentlich gesagt, dass es keine gute Praxis ist, was wohl bedeuten könnte, dass zukünftige PHP-Versionen die Fähigkeit, Code wie diesen zu schreiben, entfernen.

Verwandte Themen