2011-06-06 17 views

Respuesta

41

Con los tipos de primas se trata de una copia.

prueba.php

$a = $b = 0; 

$b = 3; 

var_dump($a); 
var_dump($b); 

salida:

int(0) 
int(3) 

Con los objetos sin embargo, es otra historia (PHP 5)

prueba.php

class Obj 
{ 
    public $_name; 
} 

$a = $b = new Obj(); 

$b->_name = 'steve'; 

var_dump($a); 
var_dump($b); 

salida

object(Obj)#1 (1) { ["_name"]=> string(5) "steve" } 
object(Obj)#1 (1) { ["_name"]=> string(5) "steve" } 
+6

Tenga en cuenta que el ejemplo es engañoso: cambiar la propiedad de un objeto no es lo mismo que cambiar la variable a la que se hace referencia. Debido a que la variable nunca cambió, es, por supuesto, lo mismo. – KingCrunch

+1

Según [documentación] (http://php.net/manual/en/internals2.variables.intro.php), PHP usa una copia en el sistema de escritura. Significa que con tipos primitivos como cadenas o ints se crean realmente en la memoria al cambiar. Es por eso que, al contrario de lo que podríamos pensar, crear referencias para optimizar el rendimiento en variables pequeñas puede no generar el efecto deseado, porque PHP necesita crearlo antes. Sin embargo, los objetos se pasan por referencia de forma predeterminada desde PHP5. – bgondy

+3

La asignación por referencia con objetos se puede cambiar para asignar mediante copia usando 'clon'.EG: '$ a = clon $ b = new Obj;' – fyrye

9

Usted podría haber intentado usted mismo

$a = $b = 0; 
$a = 5; 
echo $b; 

o

$a = $b = 0; 
$b = 5; 
echo $a; 

(actualmente Yo no me importa: D)

Por lo tanto: No, son las dos variables independientes con el valor 0.

+0

En ese ejemplo, ¿no tendría que asignar 5 a $ b en la segunda línea para comprobar que la referencia no estaba presente? Y sí, estás en lo correcto. Pensé que tener la pregunta aquí sería bueno para otros que también busquen ... –

+0

@Evil: No quiero pensar en eso, así que también he añadido al revés. Ambos devuelven '0', por lo tanto _debe_ ser cierto en cualquier caso :) – KingCrunch

+0

Aprendí algo hoy. puede ser pequeño, pero siempre divertido. –

18

Regard este código como:

$a = ($b = 0); 

La expresión $b = 0 no sólo asigna 0-$b, pero produce un resultado también. Ese resultado es la parte correcta de la asignación, o simplemente el valor asignado a $b.

Por lo tanto, $a se le asigna 0 también.

1

su les asigna tanto el valor de 0

3

Voy a recomendar una buena lectura sobre esto: http://terriswallow.com/weblog/2007/multiple-and-dynamic-variable-assignment-in-php/. En uno de los comentarios, se puede leer:

Debe tenerse en cuenta que si utiliza asignación múltiple en una sola línea a asignar un objeto, el objeto es asignado por referencia. Por lo tanto, si cambia el valor de la propiedad del objeto utilizando cualquiera de las variables, el valor esencialmente cambia en ambos.

Así que personalmente le recomendaré que asigne las variables por separado.

Para el registro:

$a = $b = 4; 
var_dump($a, $b); 
$b = 5; 
var_dump($a, $b); 

Rendimiento:

int(4) 
int(4) 
int(4) 
int(5) 

Pero:

class Tmp 
    { 
    public $foo; 

    public function __construct() 
     { 
     $this->foo = 'bar'; 
     } 
    } 

$a = $b = new Tmp(); 
var_dump($a, $b); 
$a->foo = 'oth'; 
var_dump($a, $b); 

se obtiene:

object(Tmp)#1 (1) { 
    ["foo"]=> 
    string(3) "bar" 
} 
object(Tmp)#1 (1) { 
    ["foo"]=> 
    string(3) "bar" 
} 
object(Tmp)#1 (1) { 
    ["foo"]=> 
    string(3) "oth" 
} 
object(Tmp)#1 (1) { 
    ["foo"]=> 
    string(3) "oth" 
} 

Entonces la conclusión es que no hay referencia para primitivos, pero HAY una referencia a objetos.

+0

probamos que esto es falso en realidad con algunas pruebas. –

+0

He actualizado mi respuesta. –

2

Se depende de qué asignas.

Si está asignando un valor, la tarea copia la variable original a la nueva.

Ejemplo 1:

$a = $b = 0; 
$b++; echo $a; 

Por encima de código volverá 0 ya que es la asignación por valor.

Ejemplo 2:

$a = ($b = 4) + 5; // $a is equal to 9 now, and $b has been set to 4. 

Una excepción a la asignación usual por el comportamiento de valor dentro de PHP ocurre con los objetos, que se asignan por referencia en PHP 5 automáticamente. Los objetos pueden copiarse explícitamente a través de la palabra clave clonar.

Ejemplo 3

$a = $b = $c = new DOMdocument(); 
$c->appendChild($c->createElement('html')); 
echo $a->saveHTML(); 

Por encima de código imprimirá <html></html>.

Cuestiones relacionadas