2012-01-22 7 views
8

En el ejemplo siguiente, cualquier operación realizada por $ instance2 y $ instance3 modifica el objeto original.Copia del identificador de objeto y la referencia del identificador de objeto: ¿cuál debería usarse en la aplicación real?

Mi pregunta es:

Si copia del identificador de objeto original y la referencia al identificador de objeto original hace mismo trabajo. ¿Cuál debería usarse en aplicaciones reales?

¿Cuáles son los pros y los contras de la copia del identificador de objeto y la referencia al identificador de objeto?

Leo php manual pero no puedo diferenciar en términos de uso porque ambos hacen el mismo trabajo.

$instance1 = new test(1); 
$instance2 = $instance1; 
$instance3 =& $instance1; 

//$instance1 -> original object identifier of the new object. 
//$instance2 -> copy of object identifier $instance1 
//$instance3 -> reference to the object identifier $instance1 

Respuesta

5

$instance2 tiene una copia del identificador para la prueba objeto. Por lo tanto, contiene lo mismo que $instance1. $instance3 contiene una referencia a $instance1. La diferencia sería la siguiente:

$instance1 = new Test(); 
$instance2 = $instance1; 
$instance3 = & $instance1; 

var_dump($instance1 instanceof Test); // True 
var_dump($instance2 instanceof Test); // True 
var_dump($instance3 instanceof Test); // True 

$instance3 = new AnotherTest(); 

var_dump($instance1 instanceof AnotherTest); // True 
var_dump($instance2 instanceof AnotherTest); // False 
var_dump($instance3 instanceof AnotherTest); // True 

la misma salida sería devuelto si $instance1 se cambió en lugar de $instance3.

Pero si hacemos lo siguiente:

$instance1 = new Test(); 
$instance2 = $instance1; 
$instance3 = & $instance1; 

$instance2 = new AnotherTest(); 

var_dump($instance1 instanceof AnotherTest); // False 
var_dump($instance2 instanceof AnotherTest); // True 
var_dump($instance3 instanceof AnotherTest); // False 

Así:

ha sido aprobada por creado por referencia (usando el operando &) Modificación de un wich variable o de la variable a wich que hace referencia , modifica ambos, mientras que la modificación de una variable copiada modifica solo la variable dada.

Sin embargo, se debe recordar que lo que mantiene $instance1 es un identificador del objeto, por lo que:

$instance1 = new StdClass(); 
$instance2 = $instance1; 

$instance1->my_property = 1; 
var_dump($instance2); // Output: 1 

espero que sea más claro ahora.

+0

Sus ejemplos tienen sentido, pero no debe usar la palabra 'puntero' en PHP. –

+0

Utilicé la palabra "poitner" porque las principales diferencias entre ellos son precisamente cómo los maneja el motor ... No sabía cómo expresarlo de manera diferente. – Lumbendil

+0

El término correcto es el identificador de objeto: http://php.net/manual/en/language.oop5.references.php –

0

Con los objetos en PHP5, en lugar de todo el objeto, solo se copia el identificador del objeto. Esto hace que ya no tenga que hacer referencia al mismo valor, y en su lugar solo puede copiar el identificador para referirse al mismo objeto. Úselo para su ventaja; puedes deshacerte de los signos y signos.

Una diferencia importante es que la asignación a una referencia de variable afecta a la variable original, mientras que la asignación a un identificador de objeto copiado no lo hace. Solo las modificaciones al objeto lo harían. Si desea utilizar OO de una manera intuitiva, esta sería una razón no para usar referencias a objetos. Ejemplo:

$a = new stdClass(); 
$a->name = "A"; 

$b = new stdClass(); 
$b->name = "B"; 

// $x is a copy of the object identifier in $a 
$x = $a; 
// $y is a reference to $a 
$y = &$a; 

// this will not affect $a 
$x = $b; 
echo $a->name; // 'A' 

// this will affect $a 
$y = $b; 
echo $a->name; // 'B' 

Consulte también este artículo sobre por qué el uso de referencias (ampersand) deben evitarse:

http://schlueters.de/blog/archives/125-Do-not-use-PHP-references.html

+0

¿Puede señalar alguna diferencia significativa entre ellos? no usar & es solo un beneficio de sintaxis. De lo contrario, ambos sirven para el mismo propósito. –

+0

Agregué un ejemplo que ilustra por qué es bueno aprovechar los identificadores de objetos y evitar el uso de las referencias de variables i.c.w. objetos. –

Cuestiones relacionadas