2009-07-18 6 views
76

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 ferai heureusement un #headpalm quand il s'avère être une chose simple que j'ai manquée.Syntaxe de l'accolade PHP pour la variable membre

Essayer de comprendre Zend Framework et est venu dans la syntaxe suivante:

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

Je ne l'ai jamais vu la syntaxe des accolades utilisée pour accéder à ce qui semble être une variable membre. Comment est-il différent de celui

$this->_session->user_id 

Je suppose que le _session est hors de propos, mais l'inclure dans la question, car il ne peut pas être.

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?

Tous les pointeurs dans TFM, donc je peux R serait humblement apprécié.

Merci beaucoup. Soyez gentil s'il vous plait.

+7

Merci à tous, pour les réponses rapides et excellentes. Avec cette douce initiation au SO, je suis encouragé à l'utiliser davantage. J'espère que je peux aider à répondre aux questions, pas seulement demander. Cheers. –

+1

Tidbit intéressante: Vous pouvez appeler des méthodes avec la syntaxe bouclée, et le résultat est aussi rapide que d'appeler la méthode directement. L'utilisation de call_user_func est plus générale, mais cela prend deux fois plus de temps que call_user_func (array ($ obj, $ method), "parm1", "parm2") au lieu de $ obj -> {$ method} ("parm1," parm2 " – Rolf

+0

Et ce dernier est aussi plus lisible, au moins IMO En fait, j'omets souvent les accolades sur le nom de la méthode dans ce cas: '$ obj -> $ method ($ params)' –

Répondre

46

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."; 

Ainsi, votre cas est vraiment une combinaison de deux cas spéciaux. Vous êtes autorisé à accéder à des 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 êtes juste qui les entoure avec la syntaxe accolade.

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

+2

Ce n'est pas le situation dans laquelle $ this -> _ session -> {'user_id'} est utilisé – jimyi

+0

Merci pour la réponse rapide Ouais, je vais prendre le headpalm.J'ai utilisé la syntaxe dans d'autres circonstances, je n'ai tout simplement pas reconnu Pire encore, dans ma recherche j'étais sur cette page dans le manuel, mais je n'ai pas vu l'échantillon de la variable membre ... Soupir ... Encore, l'exemple que j'ai donné était un peu bizarre cas dans lequel l'utiliser, pas vrai ambiguïté, pas de véritable délimitation nécessaire. Certainement syntaxiquement valide, mais un peu inutile âge. Tu vois ce que je veux dire? –

+2

@jimyi, j'ai précisé ma réponse plus loin. Merci. @papayasoft, je suis d'accord que c'est assez inutile dans votre cas. Je suppose que c'est du code généré automatiquement et ils utilisent la syntaxe bouclée complexe juste pour couvrir toutes les bases. –

22

Je sais que la syntaxe lors de l'utilisation variable variables:

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

+1 pour la seule réponse avec un lien approprié vers TFM, comme l'a laissé entendre @jimyi. L'O.P ne concerne pas la syntaxe complexe (bouclée) pour les chaînes. Il s'agit de l'utilisation d'accolades pour résoudre les ambiguïtés dans les variables variables. –

9

Les deux exemples dans votre question font la même chose. PHP vous permet d'accéder aux données membres/méthodes de plusieurs façons ...

object->{'name_of_member'}; 

object->name_of_member; 

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

Theres probablement un gros avantage de cette syntaxe, cependant, son généralement dans le domaine des choses poilu, et les choses que vous voulez sans doute éviter.

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

-à-dire:

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

Il ne doit pas être aussi extrême que vos exemples, cependant. Par exemple, vous pouvez imaginer que ces données de session soient stockées dans une base de données et une colonne nommée "user-id" au lieu de "user_id" ... – mercator

+2

Aussi, sur les anciennes versions de PHP mettant \ 0 au début de la chaîne ISTR vous permet d'accéder aux variables pivate. Maintenant au moins \ 0 vous donne une exception fatale "vous ne pouvez pas faire cela". –

+5

+1 pour les noms de variables absolument horribles et carrément cauchemardesques. Je n'avais pas prévu de dormir de toute façon ... –

11

Dans l'exemple que vous donnez, il n'y a pas de différence réelle, et l'OMI $this->_session->user_id devrait être utilisé car il est plus clair. La syntaxe de l'accolade est en fait bonne pour accéder à une variable de membre en construisant une expression pour son nom, comme $this->_session->{'user_id' . $index}.