Aber ich kann nicht herausfinden, warum. 0x0 (oder 0, wie Nicht-Hex-Leute es nennen) ist ein zufälliger Container, es hätte eine beliebige Zahl sein können, aber PHP-Variablen können nicht mit einer Zahl beginnen. Was ist so besonders an der { } hier verwendet, und was sind ihre Grenzen?
Wir können {} verwenden, um einen Variablennamen zu erstellen PHP.
– Yogesh Suthar
7. März 2013 um 11:57 Uhr
0x0 ist eine ASCII-NULL, wenn sie in eine Zeichenfolge umgewandelt wird; und wird tatsächlich verwendet, um Klasseneigenschaftsnamen intern voranzustellen (etwas, dessen sich Ihre Skripte nicht wirklich bewusst sind); so technisch undokumentiert gültig, weil es für einen speziellen Zweck verwendet wird
– Markus Bäcker
7. März 2013 um 12:03 Uhr
@ MarkBaker – Ich denke, es gibt keine chr() hier, nur regelmäßig (string).
– Alvaro González
7. März 2013 um 12:26 Uhr
Alvaro González
Zuerst, 0x0 ist nur ein Stammgast 0 in hexadezimaler Darstellung, die in eine Zeichenfolge umgewandelt wird '0' bei Verwendung mit der Variablenvariablensyntax:
var_dump(0x0===0); // prints "bool(true)"
${0x0} = 'test';
echo ${0x0}; // prints "test"
echo ${'0'}; // prints "test" as well
var_dump(get_defined_vars()); // contains ["0"] => string(4) "test"
Variablennamen folgen den gleichen Regeln wie andere Labels in PHP. Ein gültiger Variablenname beginnt mit einem Buchstaben oder Unterstrich, gefolgt von einer beliebigen Anzahl von Buchstaben, Ziffern oder Unterstrichen. Als regulärer Ausdruck würde es so ausgedrückt werden: ‘[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*’
Dies ist der Grund, warum $0foo = 'Test'; löst einen Analysefehler aus.
Einige schnelle Tests mit dem Variable Variablen-Syntax zeigt, dass sich PHP tatsächlich nicht wirklich um Variablennamen zu kümmern scheint, sofern es sich um Strings handelt:
Meine Vermutung ist, dass die oben erwähnte Namensbeschränkung eher vom Quellcode-Parser als vom Sprachkern auferlegt wird. Es braucht solche Regeln, um Variablen bei der Analyse von PHP-Code voneinander zu unterscheiden. Intern die Zend-Engine, die PHP antreibt behandelt Variablen als Hashmap:
PHP-Variablen bestehen im Allgemeinen aus zwei Dingen: Dem Label, das beispielsweise ein Eintrag in einer Symboltabelle sein kann, und dem eigentlichen Variablencontainer.
Solange es also einen gültigen String für das Label erhält, ist es zufrieden.
Es können auch geschweifte Klammern verwendet werden, um den Eigenschaftsnamen klar abzugrenzen. Sie sind am nützlichsten, wenn auf Werte innerhalb einer Eigenschaft zugegriffen wird, die ein Array enthält, wenn der Eigenschaftsname aus mehreren Teilen besteht, oder wenn der Eigenschaftsname Zeichen enthält, die ansonsten nicht gültig sind (zB von json_decode() oder SimpleXML).
Für mich bedeutet dies, dass, wenn Sie verwenden ${...}, gibt es keine Einschränkungen hinsichtlich der Zeichen, die in einem Variablennamen verwendet werden dürfen. Ob Sie jedoch …
Genau. Variablennamen müssen keine gültigen Bezeichner sein. Nur die $identifier-Syntax erfordert dies.
– Alex
7. März 2013 um 12:02 Uhr
Der PHP-Parser bietet eine spezielle Syntax zum Erstellen eines Variablennamens aus einem beliebigen Ausdruck, der eine Zeichenfolge zurückgibt (oder in eine Zeichenfolge umgewandelt werden kann), z.
Wir können {} verwenden, um einen Variablennamen zu erstellen
PHP
.– Yogesh Suthar
7. März 2013 um 11:57 Uhr
0x0 ist eine ASCII-NULL, wenn sie in eine Zeichenfolge umgewandelt wird; und wird tatsächlich verwendet, um Klasseneigenschaftsnamen intern voranzustellen (etwas, dessen sich Ihre Skripte nicht wirklich bewusst sind); so technisch undokumentiert gültig, weil es für einen speziellen Zweck verwendet wird
– Markus Bäcker
7. März 2013 um 12:03 Uhr
@ MarkBaker – Ich denke, es gibt keine
chr()
hier, nur regelmäßig(string)
.– Alvaro González
7. März 2013 um 12:26 Uhr