2013-03-07 12 views
37

Il seguente codice è perfettamente funzionante:

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

Ma io non riesco a capire perché. 0x0 (o 0, come viene chiamato da persone non esadecimali) è un contenitore casuale, potrebbe essere un numero qualsiasi, ma le variabili php non possono iniziare con un numero. Cosa c'è di così speciale nello { } usato qui e quali sono i loro limiti?

+0

possiamo usare {} per creare un nome di variabile in 'PHP'. –

+0

0x0 è un NULL ASCII quando chr'd alla stringa; ed è effettivamente usato per prefissare internamente i nomi delle proprietà di classe (qualcosa di cui i tuoi script non sono realmente a conoscenza); quindi tecnicamente non documentato valido perché è usato per uno scopo speciale –

+0

@MarkBaker - Penso che non ci sia 'chr()' qui, solo regolare '(stringa)'. –

risposta

30

Prima di tutto, 0x0 è solo un normale 0 in esadecimali che viene gettato a stringa '0 'quando viene utilizzato con la sintassi variabile variabile:

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" 

siete sulla strada giusta del siero di latte si dice che esso isn' t a :

I nomi di variabili seguono le stesse regole delle altre etichette in PHP. Un nome di variabile valido inizia con una lettera o underscore, seguito da qualsiasi numero di lettere, numeri o caratteri di sottolineatura.Come un'espressione regolare, sarebbe espresso così: '[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] *'

Questo è il motivo per cui $0foo = 'Test'; attiva un errore di analisi.

alcuni test rapido con la variable variables syntax rivela che, di fatto, PHP non sembra davvero cura i nomi delle variabili nella misura in cui sono stringhe:

${'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" 

è che si impone mia ipotesi il suddetto limite di denominazione dal parser del codice sorgente piuttosto che dal core della lingua. Ha bisogno di tali regole per distinguere le variabili quando si analizza il codice PHP. Internamente, il motore Zend che alimenta PHP handles variables come una mappa di hash:

variabili PHP, in generale, sono costituiti da due cose: L'etichetta, che potrebbe, per esempio, essere una voce in una tabella dei simboli, e il contenitore variabile attuale .

Quindi, fino a quando riceve una stringa valida per l'etichetta, è felice.

25

Dal documentation:

parentesi graffe possono essere utilizzati anche, per delimitare chiaramente il nome della proprietà. Sono più utili quando si accede ai valori all'interno di una proprietà che contiene un array, quando il nome della proprietà è composto da parti multiple o quando il nome della proprietà contiene caratteri che non sono altrimenti validi (ad esempio da json_decode() o SimpleXML).

Per me questo implica che se si utilizza ${...}, non ci sono limitazioni riguardo a quali caratteri possono essere utilizzati in un nome di variabile. Sia che si dovrebbe comunque ...

+2

Precisamente. I nomi delle variabili non devono essere identificativi validi. Solo la sintassi $ identificatore richiede questo. – Alex

+2

Fantastico, questo è esattamente il pezzo che mi mancava, grazie! –

3

PHP parser fornisce una sintassi speciale per creare un nome di variabile da qualsiasi espressione che restituisce stringa (o può essere colato a stringa), ad es .:

<?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 

Questa sintassi è disponibile anche per le proprietà dell'oggetto:

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

0x0 è solo una rappresentazione esadecimale 0 letterale.

2

In cima a quello che ha detto @ Michael Robinson, nel tuo esempio questo sarà anche valida:

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

In altre parole tutto ciò all'interno delle parentesi graffe in questi casi è una stringa!

So s 0x0 è infatti la versione esadecimale di 0 ma qui entrambe sono stringhe! Ecco perché ${0x0} o ${0} funzionano, dove $0 o $0x0 no!

Problemi correlati