2011-04-11 12 views
7

He intentado añadir objetos en una matriz en PHP, pero no funcionó, intentaron 2 métodos:cómo empujar una copia de un objeto en una matriz en PHP

# 1

$obj->var1 = 'string1'; 
$obj->var2 = 'string1'; 
$arr[] = $obj; 
$obj->var1 = 'string2'; 
$obj->var2 = 'string2'; 
$arr[] = $obj; 

# 2

$obj->var1 = 'string1'; 
$obj->var2 = 'string1'; 
array_push($arr,$obj); 
$obj->var1 = 'string2'; 
$obj->var2 = 'string2'; 
array_push($arr,$obj); 

Ambos métodos agregarán el último objeto en una matriz completa. Parece que el objeto se agrega a la matriz por referencia. ¿Hay alguna forma de agregarlos a la matriz por valor?

Respuesta

12

objetos siempre se pasan por referencia en PHP 5 o posterior. Si desea una copia, puede utilizar el operador clon

$obj = new MyClass; 
$arr[] = clone $obj; 
+0

¡solo pasé por referencia en PHP 5, creo! – RobertPitt

+0

@RobertPitt Sí, en PHP 4, los objetos se pasaron por valor en tales situaciones. Pero en PHP 5, los objetos se pasan por referencia. – Michael

+0

@Michael, insinué que lo menciona en su publicación. – RobertPitt

0

Prueba esto:

$arr[] = clone $obj; 
3

Hay que clonar primero el objeto antes de realizar modificaciones:

$obj->var1 = 'string1'; 
$obj->var2 = 'string1'; 
$arr[] = $obj; 

$obj = clone $obj; // Clone the object 

$obj->var1 = 'string2'; 
$obj->var2 = 'string2'; 
$arr[] = $obj; 
1

En PHP 5, los objetos se pasan por referencia, a menos que lo especifiques de otra manera.

Aquí, es probable que quieren clone el objeto cuando se agrega a la matriz:

$obj->var1 = 'string1'; 
$obj->var2 = 'string1'; 
$arr[] = clone $obj; 
$obj->var1 = 'string2'; 
$obj->var2 = 'string2'; 
$arr[] = clone $obj; 

See the manual.

Cuestiones relacionadas