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.


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


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};

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 }"} 

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}.


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;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.