2010-05-23 17 views
5

¿alguien tiene idea si y cómo es posible destruir/cambiar el objeto php al que se hace referencia en muchos lugares? Unset obviamente destruye solo una referencia, y algunas veces el rastreo de todas las referencias manualmente no es una opción. ¿Algunas ideas? Tal vez hay algo que me falta en Reflection?¿hay alguna manera de acceder a todas las referencias al objeto dado?

Respuesta

3

Niza respuesta Marcos, pero no estoy seguro de cómo esto funcionaría:

primer diagrama:

<?php 

$obj = "foo"; 
$a = $obj; 
$b = $obj; 
$c = $obj; 

$c = NULL; 
unset($c); 
var_dump($a, $b, $c); 

Resultados:

string(3) "foo" 
string(3) "foo" 
NULL 

segundo diagrama:

<?php 

$obj = "foo"; 
$wrapper =& $obj; 
$a = $wrapper; 
$b = $wrapper; 
$c = $wrapper; 

$c = NULL; 
unset($c); 
var_dump($a, $b, $c); 

Resultados:

string(3) "foo" 
string(3) "foo" 
NULL 

forma correcta:

<?php 

$obj = "foo"; 
$a =& $obj; 
$b =& $obj; 
$c =& $obj; 

$c = NULL; 
var_dump($a, $b, $c); 

Resultados:

NULL 
NULL 
NULL 

Explicación:

Es necesario hacer referencia a las variables $ a, $ b, $ c para la dirección de memoria de $ obj, este forma cuando configura $ c en NULL, esto establecerá la dirección de memoria real en NULL en lugar de solo la referencia.

+0

aunque pragmáticamente, al establecer una referencia a un objeto, no siempre es más fácil establecerlo usando una referencia. – andho

6

No, pero se puede usar un nivel extra de indirección en su lugar. Actualmente tiene este:

a b  c   a b (unset) 
    \ | /   \ | 
    \ | / -->  \ | 
    object     object 

su lugar se puede hacer esto:

a b  c   a b  c 
    \ | /   \ | /
    \ | / -->  \ | /
    wrapper    (unset) 
     | 
     | 
    object 
+0

Niza respuesta visual. – webbiedave

Cuestiones relacionadas