2013-03-07 17 views
37

Der folgende Code funktioniert perfekt:

${0x0} = 'test'; 
echo ${0x0}; // prints "test" 

Aber ich kann nicht herausfinden, warum. 0x0 (oder 0, als Nicht-Hex-Leute nennen es) ist ein zufälliger Container, es könnte eine beliebige Zahl gewesen sein, aber PHP-Variablen können nicht mit einer Zahl beginnen. Was ist das Besondere an der { } hier verwendet, und was sind ihre Grenzen?

+0

können wir {} verwenden, um einen Variablennamen in 'PHP' zu erstellen. –

+0

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 –

+0

@MarkBaker - Ich denke, es gibt keine 'chr()' hier, nur normale '(string)'. –

Antwort

30

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.

25

Vom documentation:

Geschweifte Klammern können auch verwendet werden, um eindeutig die Eigenschaftsnamen zu begrenzen. Sie sind am nützlichsten beim Zugriff auf Werte innerhalb einer Eigenschaft, 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 (z. B. von json_decode() oder SimpleXML).

Für mich bedeutet, dass, wenn Sie ${...} verwenden, gibt es keine Einschränkungen in Bezug auf welche Zeichen in einem Variablennamen verwendet werden. Ob Sie sollten jedoch ...

+2

Genau. Variablennamen müssen keine gültigen Bezeichner sein. Nur die $ identifier-Syntax erfordert dies. – Alex

+2

Super, das ist genau das, was ich vermisst habe, danke! –

3

PHP-Parser bietet eine spezielle Syntax, um einen Variablennamen aus einem beliebigen Ausdruck zu erstellen, die Zeichenfolge zurückgibt (oder kann in String gegossen werden), zB .:

<?php 

define('A', 'aaa'); 

${' _ '} = 'blah'; 
${'test' . A . (2 + 6)} = 'var'; 

echo ${' _ '}; // blah 
echo ${'testaaa8'}; // var 

${'123'} = 'blah'; 
echo ${100 + 23}; // blah 

function returnVarName() { 
    return 'myVar'; 
} 

$myVar = 12; 
echo ${returnVarName()}; // 12 

Diese Syntax ist auch für Objekteigenschaften zur Verfügung:

$object->{' some property ... with strage name'}; 

0x0 ist nur eine hexadezimale Darstellung von 0 wörtlich zu nehmen.

2

Obendrein, was gesagt @ Michael Robinson, dies in Ihrem Beispiel wird auch gültig sein:

${0x0} = 'test'; 
$var = "0"; 
echo $$var; // prints "test" 
4

Mit anderen Worten, alles innerhalb der geschweiften Klammern in solchen Fällen ein String!

Also s 0x0 ist in der Tat die Hex-Version von 0 aber hier sind beide Zeichenfolgen! Deshalb ${0x0} oder ${0} funktionieren, wobei $0 oder $0x0 nicht!

Verwandte Themen