2009-07-18 14 views
76

Primera pregunta sobre SO y es un verdadero candidato RTM. Pero te prometo que he buscado y parece que no puedo encontrarlo. Estaré encantado de hacer un #headpalm cuando resulte ser algo simple que eché de menos.Sintaxis de llaves PHP para la variable miembro

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

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

nunca he visto la sintaxis de llaves utilizado para acceder a lo que parece ser una variable miembro. ¿Cómo se diferencia de

$this->_session->user_id 

Estoy asumiendo que el _SESSION es irrelevante, pero incluirla en la cuestión, ya que no puede ser.

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

Cualquier apuntador en TFM, así que puedo R, sería humildemente apreciado.

Muchas gracias. Por favor se gentil.

+7

Gracias a todos, por las respuestas rápidas y excelentes. Con esta suave iniciación en SO, me alienta a usarlo más. Con suerte, puedo ayudar a responder preguntas, no solo preguntarlas. Saludos. –

+1

Tidbit interesante: puede llamar a los métodos con la sintaxis rizada, y el resultado es tan rápido como llamar al método directamente. El uso de call_user_func es más general, pero se tarda el doble en hacer call_user_func (array ($ obj, $ method), "parm1", "parm2") en lugar de $ obj -> {$ method} ("parm1," parm2 "); – Rolf

+0

Y este último es más legible también. Al menos IMO. En realidad, a menudo omito las llaves en el nombre del método en ese caso: '$ obj -> $ method ($ params)' –

Respuesta

46

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

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

Por lo tanto, su caso es realmente una combinación de dos casos especiales. Se le permite acceder a las variables de clase se utilizan llaves y de este modo:

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

Y en su caso, sólo estás rodeándolos con la sintaxis de corchete.

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

+2

Este no es el situación en la que se usa $ this -> _ session -> {'user_id'}. – jimyi

+0

Gracias por la respuesta rápida. Sí, tomaré el headpalm. He utilizado la sintaxis en otras circunstancias, simplemente no reconocí en el contexto de las variables miembro. Lo que es peor, 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 dí fue un tanto extraño caso en que usarlo, ¿verdad? No hay ambigüedad real, no es necesaria una delineación real. Ciertamente sintácticamente válido, pero como algo innecesario. años. ¿Ves lo que quiero decir? –

+2

@jimyi, aclaré mi respuesta aún más. Gracias. @papayasoft, estoy de acuerdo en que es bastante innecesario en su caso. Supongo que es un código autogenerado y usan la compleja sintaxis rizada solo para cubrir todas las bases. –

22

sé la sintaxis justo cuando se utiliza variable variables:

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

+1 para la única respuesta con un enlace adecuado a TFM, como lo indicó @jimyi. El O.P. no se trata de la sintaxis compleja (rizada) para cadenas. Se trata del uso de llaves para resolver ambigüedades en variables variables. –

9

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

object->{'name_of_member'}; 

object->name_of_member; 

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

Theres probablemente una gran ventaja de que la sintaxis, sin embargo, su general en el dominio de cosas peludas, y cosas que probablemente desea evitar.

Le permite usar caracteres en nombres de variables que de lo contrario 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

Aunque no tiene que ser tan extremo como tus ejemplos. Por ejemplo, podría imaginar tener esos datos de sesión almacenados en una base de datos, y una columna llamada "user-id" en lugar de "user_id" ... – mercator

+2

También, en versiones anteriores de PHP poniendo \ 0 al frente de la cadena ISTR permitirte acceder a las variables de pivate Ahora al menos \ 0 te da una excepción fatal "no puedes hacer eso". –

+5

+1 para nombres de variables absolutamente horribles y francamente inductores de pesadillas. No estaba planeando dormir de todos modos ... –

11

En el ejemplo que se da, no hay ninguna diferencia real, y la OMI $this->_session->user_id se debe utilizar porque es más clara.

Para qué sirve la sintaxis de llaves es acceder a una variable miembro mediante la construcción de una expresión para su nombre, como $this->_session->{'user_id' . $index}.

Cuestiones relacionadas