Sintaxis de llaves PHP para variable miembro

79

Primera pregunta sobre SO y es un verdadero candidato a RTM. Pero te prometo que he buscado y parece que no puedo encontrarlo. Felizmente haré un #headpalm cuando resulte ser algo simple que me perdí.

Tratando de averiguar Zend Framework y encontré la siguiente sintaxis:

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

Nunca he visto la sintaxis de llaves que se usa para acceder a lo que parece ser una variable miembro. ¿En qué se diferencia de

$this->_session->user_id

Supongo que la _session es irrelevante, pero la incluyo en la pregunta, ya que puede que no lo sea.

¿Las llaves son solo una convención de limpieza que intenta envolver el nombre de la variable compuesta user_id? ¿O es algún tipo de accesorio especial?

Cualquier sugerencia sobre TFM para que pueda R up sería humildemente apreciada.

Muchas gracias. Por favor se gentil.

David Weinraub
fuente
7
Gracias a todos por las rápidas y excelentes respuestas. Con esta suave iniciación en SO, se me anima a usarlo más. Con suerte, puedo ayudar a responder preguntas, no solo hacerlas. Salud.
David Weinraub
1
Dato interesante: puede llamar a métodos con la sintaxis curly, y el resultado es tan rápido como llamar al método directamente. Usar call_user_func es más general, pero lleva el doble de tiempo hacer call_user_func (array ($ obj, $ método), "parm1", "parm2") en lugar de $ obj -> {$ método} ("parm1," parm2 " );
Rolf
Y este último también es más legible. Al menos en mi opinión. En realidad, a menudo omito las llaves en el nombre del método en ese caso:$obj->$method($params)
David Weinraub

Respuestas:

51

Las llaves se utilizan para especificar explícitamente el final de un nombre de variable. Por ejemplo:

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

Entonces, su caso es realmente una combinación de dos casos especiales. Se le permite acceder a las variables de clase usando llaves y así:

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

Y en su caso, simplemente los está rodeando con la sintaxis de llaves.

Consulte el manual de PHP , "sintaxis compleja (rizada)".

James Skidmore
fuente
2
Esta no es la situación en la que se utiliza $ this -> _ session -> {'user_id'}.
jimyi
Gracias por la rápida respuesta. Sí, me quedo con la palma de la cabeza. He usado la sintaxis en otras circunstancias, simplemente no la reconocí en el contexto de las variables miembro. Peor aún, en mi búsqueda estaba en esa página del manual, pero no vi la muestra de la variable miembro. Suspiro ... Aún así, el ejemplo que di fue un caso extraño en el que usarlo, ¿verdad? No hay ambigüedad real, no es necesaria una delimitación real. Ciertamente válido sintácticamente, pero un tipo de uso innecesario. ¿Ves lo que quiero decir?
David Weinraub
2
@jimyi, aclaré más mi respuesta. Gracias. @papayasoft, estoy de acuerdo en que es bastante innecesario en tu caso. Supongo que es un código generado automáticamente y usan la sintaxis compleja y rizada solo para cubrir todas las bases.
James Skidmore
24

Conozco la sintaxis solo cuando uso variables variables :

$userProp = 'id';
$this->_session->{'user_'.$userProp};
Gumbo
fuente
1
+1 para la única respuesta con un enlace adecuado a TFM, como insinuó @jimyi. El OP no se trata de la sintaxis compleja (rizada) de las cadenas. Se trata del uso de llaves para resolver ambigüedades en variables variables.
Bob Stein
19

Probablemente haya una gran ventaja de esa sintaxis, sin embargo, generalmente está en el dominio de cosas complicadas y cosas que probablemente quieras evitar.

Le permite utilizar caracteres en nombres de variables que de otro modo no están permitidos.

es decir:

$this->object->{"hello world\0\n"} 
$this->object->{"function(){   this is a truely awful  name for a variable }"} 
Kent Fredric
fuente
6
Sin embargo, no tiene que ser tan extremo como tus ejemplos. Por ejemplo, podría imaginar tener los datos de la sesión almacenados en una base de datos y una columna llamada "user-id" en lugar de "user_id" ...
mercator
2
Además, en versiones anteriores de PHP, poner \ 0 al principio de la cadena ISTR le permite acceder a variables privadas. Ahora al menos \ 0 le da una excepción fatal "no puede hacer eso, lo siento".
Kent Fredric
12

En el ejemplo que da, no hay una diferencia real, y $this->_session->user_iddebería usarse IMO porque es más claro.

Lo que la sintaxis de llaves es realmente buena para acceder a una variable miembro construyendo una expresión para su nombre, como $this->_session->{'user_id' . $index}.

caos
fuente
11

Los dos ejemplos de su pregunta hacen lo mismo. PHP le permite acceder a datos / métodos de miembros de varias maneras ...

object->{'name_of_member'};

object->name_of_member;

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