Syntaxe d'Accolade PHP pour la variable membre

Première question sur SO et c'est un vrai candidat RTM. Mais je vous promets que j'ai regardé et que je n'arrive pas à le trouver. Je vais heureusement faire un # headpalm quand il s'avère être une chose 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 des 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 y compris dans la question car il ne peut pas être.

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

Tous les pointeurs dans TFM afin que je puisse R up seraient humblement appréciés.

Merci beaucoup. Soyez doux.

78
demandé sur Funk Forty Niner 2009-07-18 20:18:42

5 réponses

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 particuliers. Vous êtes autorisé à accéder aux variables de classe en utilisant des accolades et comme ceci:

$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 le manuel PHP , " syntaxe complexe (bouclée)."

50
répondu James Skidmore 2014-04-21 21:23:13

Je connais la syntaxe juste en utilisant variables variables :

$userProp = 'id';
$this->_session->{'user_'.$userProp};
23
répondu Gumbo 2009-07-18 16:24:07

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

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

Exemple:

$this->object->{"hello world\0\n"} 
$this->object->{"function(){   this is a truely awful  name for a variable }"} 
19
répondu Kent Fredric 2009-07-18 16:32:57

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

Ce que la syntaxe des accolades est réellement bonne, c'est d'accéder à une variable membre en construisant une expression pour son nom, comme $this->_session->{'user_id' . $index}.

11
répondu chaos 2009-07-18 16:46:43

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 façons...

object->{'name_of_member'};

object->name_of_member;

$member = 'name_of_member';
object->$member;
10
répondu Donnie DeBoer 2009-07-18 16:28:10