2012-02-27 12 views
8
$bar = 7; 
$foo =& $bar = 9; 

Desde un punto de vista técnico, ¿no se evaluaría esto de derecha a izquierda? Entonces: $ bar = 9; $ foo = & $ bar¿Por qué no puedo asignar una variable a la que se hace referencia en PHP?

En caso de que alguien se lo esté preguntando. La razón por la que hago esto en una línea es para evitar recortes de uñas en los dedos de los pies.

+7

¿Recortes de uñas del dedo del pie? – Tim

+0

Es lo mismo que '$ foo = & ($ bar = 9)', lo que obviamente no funciona. – h0tw1r3

+0

Agregar corchetes no hace las cosas más obvias en este caso. Eso sí, simplemente estoy siendo el abogado del diablo. Aunque no soy fanático de que semánticamente 9 se devuelva $ bar, esto tiene sentido. –

Respuesta

13

La expresión de asignación $bar = 9 no devuelve una referencia a $bar (es decir, la variable en sí); en su lugar, devuelve el valor entero 9.

O si necesita una cita de la manual:

El valor de una expresión de asignación es el valor asignado. Es decir, el valor de "$ a = 3" es 3.

No se puede asignar una referencia directa a un valor, sólo para una variable que contiene ese valor. Por lo tanto, su práctico forro interior falla espectacularmente y tendrá que dividirlo en dos.

+0

Gracias BoltClock, esto tiene sentido. ¿Funciona de esta manera en C++? No tengo un compilador a mano. Si no funciona de esa manera en C++, ¿hay algún lenguaje que funcione de esta manera? ¿Es posible? Quiero decir, ¿por qué no devolver $ bar y esperar hasta el último segundo posible para evaluar la barra a un literal, de esta manera puede obtener la referencia de la barra, en lugar de quedar atrapado con el literal? –

+0

Hasta donde yo sé, se comporta igual en otros lenguajes estilo C para primitivas (ints, longs, floats, chars) - las expresiones de asignación siempre devuelven básicamente el valor asignado. En cuanto a su última pregunta ... No estoy seguro acerca de la semántica exacta de los operadores de asignación, así que no puedo dar más detalles sobre eso. – BoltClock

+0

jaja, pensando en ello, mi mente está un poco estropeada por tanto javascript. El problema es que $ bar y todas las variables no son referencias. So Bolt, ¿funcionaría el siguiente C++: "int v; int & j; v = j = 9;" Creo que sí. Por desgracia, no creo que puedas escribir algo similar en PHP. –

2

Por la misma razón por la que

$bar =& 9; 

no es válido (porque de referencia puede apuntar a otra variable, pero no es constante/literal). Ver: http://www.php.net/manual/en/language.references.whatdo.php

+0

Vea la respuesta de BoltClock por lo que me confundió. Sé que no puedes tomar una referencia de un literal. Lo que no sabía era que la tarea devolvía un literal en lugar de una referencia. –

Cuestiones relacionadas