Zunächst einmal 0x0
ist nur eine ganz normale 0
in hexadezimale Darstellung, die '0
bespannen gegossen wird ‚wenn sie mit der Variablen Variable Syntax verwendet:
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"
Sie richtig Molke Sie sagen, dass es isn‘ t a valid variable name:
Variablennamen folgen denselben Regeln wie andere Bezeichnungen in PHP. Ein gültiger Variablenname beginnt mit einem Buchstaben oder Unterstrich, gefolgt von einer beliebigen Anzahl von Buchstaben, Zahlen oder Unterstrichen."[A-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] *
Dies ist das ist: als regulärer Ausdruck, würde es so ausdrücken Grund, warum $0foo = 'Test';
einen Parse-Fehler auslöst.
Einige schnellen Tests mit den variable variables syntax zeigen, dass in der Tat, PHP scheint nicht wirklich so weit über Variablennamen zu kümmern, wie sie Strings sind:
${'123 abc xyz '} = 'Test';
echo ${'123 abc xyz '}; // Test
echo ${'123 abc xyz '}; // PHP Notice: Undefined variable: 123 abc xyz in ...
var_dump(get_defined_vars()); // ["123 abc xyz "] => string(4) "Test"
Meine Vermutung ist, dass die genannte Name Beschränkung auferlegt durch den Quellcode-Parser anstelle des Sprachkerns. Es benötigt solche Regeln, um Variablen bei der Analyse von PHP-Code auseinander zu halten. Intern wird die Zend Engine, die PHP handles variables als Hash-Karte:
PHP-Variablen in der Regel bestehen aus zwei Dingen: Das Label, das könnte zum Beispiel ein Eintrag in einer Symboltabelle sein, und der tatsächliche variable Container .
So weit wie es eine gültige Zeichenfolge für das Etikett erhält, ist es glücklich.
können wir {} verwenden, um einen Variablennamen in 'PHP' zu erstellen. –
0x0 ist ein ASCII NULL wenn chr'd zu string; und wird tatsächlich verwendet, um Klasseneigenschaftsnamen intern voran zu stellen (etwas, das Ihren Skripten nicht bewusst ist); so technisch undokumentiert gültig, weil es für einen speziellen Zweck verwendet wird –
@MarkBaker - Ich denke, es gibt keine 'chr()' hier, nur normale '(string)'. –