2009-07-18 14 views
76

Prima domanda su SO ed è un vero candidato RTM. Ma ti prometto che ho guardato e non riesco a trovarlo. Farò felicemente un #headpalm quando si rivelerà una cosa semplice che mi è sfuggita.Sintassi di parentesi graffa PHP per variabile membro

Cercando di capire Zend Framework e mi sono imbattuto la seguente sintassi:

$this->_session->{'user_id'} 

Non ho mai visto la sintassi parentesi graffe utilizzato per accedere a quello che sembra essere una variabile membro. Come è diverso da quello

$this->_session->user_id 

Sto assumendo che il _SESSION è irrilevante, ma includendolo nella questione in quanto non può essere.

Le parentesi graffe sono solo una convenzione di pulizia che tenta di avvolgere il nome della variabile composta user_id? O è una specie di accessorio speciale?

Eventuali puntatori in TFM in modo da poter R su sarebbe essere umilmente apprezzato.

Molte grazie. Per piacere sii gentile.

+7

Grazie a tutti, per le risposte rapide ed eccellenti. Con questa delicata iniziazione a SO, sono incoraggiato ad usarlo di più. Spero di poter aiutare a rispondere alle domande, non solo a chiederle. Cheers. –

+1

Tidbit interessante: puoi chiamare i metodi con la sintassi ricci e il risultato è veloce come chiamare direttamente il metodo. L'utilizzo di call_user_func è più generale, ma impiega il doppio del tempo per eseguire call_user_func (array ($ obj, $ method), "parm1", "parm2") anziché $ obj -> {$ method} ("parm1," parm2 " – Rolf

+0

E anche quest'ultimo è più leggibile. Almeno IMO. In realtà, spesso ometto le parentesi graffe sul nome del metodo in questo caso: '$ obj -> $ method ($ params)' –

risposta

46

Le parentesi graffe vengono utilizzate per specificare esplicitamente la fine di un nome di variabile. Per esempio:

echo "This square is {$square->width}00 centimeters broad."; 

Quindi, il tuo caso è davvero una combinazione di due casi particolari. Si è permesso di accedere alle variabili di classe con le parentesi graffe e in questo modo:

$class->{'variable_name'} // Same as $class->variable_name 
$class->{'variable' . '_name'} // Dynamic values are also allowed 

E nel tuo caso, sei solo li circonda con la sintassi parentesi graffa.

Vedere PHP manual, "sintassi complessa (riccia)".

+2

Questo non è il situazione in cui $ this -> _ session -> {'user_id'} è in uso – jimyi

+0

Grazie per la rapida risposta Sì, prendo il headpalm. Ho usato la sintassi in altre circostanze, semplicemente non ho riconosciuto anche nel contesto delle variabili membro. Ancora peggio, nella mia ricerca ero su quella pagina nel manuale, ma non ho visto l'esempio di variabile membro. Sigh ... Ancora, l'esempio che ho dato era una specie di strano caso in cui usarlo, giusto? Nessuna vera ambiguità, nessuna reale delineazione necessaria. Sicuramente sintatticamente valida, ma tipo di inutile noi età. Capito quello che intendo? –

+2

@jimyi, ho chiarito ulteriormente la mia risposta. Grazie. @papayasoft, sono d'accordo sul fatto che è abbastanza inutile nel tuo caso. La mia ipotesi è che è un codice generato automaticamente e usano la complessa sintassi ricci per coprire tutte le basi. –

22

so la sintassi solo quando si utilizza variable variables:

$userProp = 'id'; 
$this->_session->{'user_'.$userProp}; 
+1

+1 per la sola risposta con un link corretto a TFM, come suggerito da @jimyi. O.P. non riguarda la sintassi complessa (riccia) per le stringhe. Si tratta dell'uso di parentesi graffe per risolvere le ambiguità nelle variabili variabili. –

9

I due esempi nella tua domanda fanno la stessa cosa. PHP consente di accedere ai dati dei membri/metodi in diversi modi ...

object->{'name_of_member'}; 

object->name_of_member; 

$member = 'name_of_member'; 
object->$member; 
19

C'è probabilmente una grande vantaggio di quella sintassi, tuttavia, il suo genere nel campo della roba pelosa, e le cose probabilmente si vuole evitare.

Consente di utilizzare caratteri in nomi di variabili altrimenti non ammessi.

cioè:

$this->object->{"hello world\0\n"} 
$this->object->{"function(){ this is a truely awful name for a variable }"} 
+6

Non deve essere estremo come i tuoi esempi, però. Ad esempio, potresti immaginare di avere i dati di sessione memorizzati in un database e una colonna denominata "user-id" invece di "user_id" ... – mercator

+2

Inoltre, nelle versioni precedenti di PHP inserire \ 0 nella parte anteriore della stringa ISTR ti consente di accedere alle variabili pivate. Ora almeno \ 0 ti dà un'eccezione "non puoi fare che mi dispiace". –

+5

+1 per nomi di variabili assolutamente orribili e assolutamente da incubo. Non avevo in programma di dormire comunque ... –

11

Nell'esempio si dà, non c'è vera differenza, e IMO $this->_session->user_id dovrebbe essere usato perché è più chiaro.

Ciò che la sintassi della parentesi graffa è effettivamente utile per accedere a una variabile membro costruendo un'espressione per il suo nome, ad esempio $this->_session->{'user_id' . $index}.

Problemi correlati