web-dev-qa-db-fra.com

PHP syntaxe d'accolade pour la variable membre

Première question sur SO et c'est un vrai RTM candidat. Mais je vous promets que j'ai regardé et que je n'arrive pas à le trouver. Je serai heureux faire un #headpalm quand il s'avère que c'est quelque chose de simple que j'ai manqué.

Essayer de comprendre Zend Framework et est tombé sur la syntaxe suivante:

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

Je n'ai jamais vu la syntaxe d'accolades utilisées pour accéder à ce qui semble être une variable membre. En quoi est-ce différent de

$this->_session->user_id

Je suppose que la _session n'est pas pertinente, mais l'inclure dans la question car elle ne l'est peut-être pas.

Les accolades sont-elles simplement une convention de propreté qui tente d'envelopper le nom de variable composé user_id? Ou est-ce une sorte d'accesseur spécial?

Tout pointeur dans TFM pour que je puisse remonter serait humblement apprécié.

Merci beaucoup. Soyez gentil s'il vous plait.

79
David Weinraub

Les accolades sont utilisées pour spécifier explicitement la fin d'un nom de variable. Par exemple:

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

Donc, votre cas est vraiment une combinaison de deux cas spéciaux. Vous êtes autorisé à accéder aux variables de classe en utilisant des accolades et ainsi de suite:

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

Et dans votre cas, vous les entourez simplement de la syntaxe des accolades.

Voir PHP manual , "syntaxe complexe (bouclée)".

51
James Skidmore

Je connais la syntaxe juste en utilisant variables variables :

$userProp = 'id';
$this->_session->{'user_'.$userProp};
23
Gumbo

Il y a probablement un gros avantage de cette syntaxe, cependant, c'est généralement dans le domaine des trucs velus, et des choses que vous voulez probablement éviter.

Il vous permet d'utiliser des caractères dans des noms de variables qui ne sont pas autorisés autrement.

c'est à dire:

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

Les deux exemples de votre question font la même chose. PHP vous permet d'accéder aux données/méthodes des membres de plusieurs manières ...

object->{'name_of_member'};

object->name_of_member;

$member = 'name_of_member';
object->$member;
11
Donnie DeBoer

Dans l'exemple que vous donnez, il n'y a pas de réelle différence, et IMO $this->_session->user_id doit être utilisé car il est plus clair.

La syntaxe des accolades est en fait utile pour accéder à une variable membre en construisant une expression pour son nom, comme $this->_session->{'user_id' . $index}.

11
chaos