2010-07-15 17 views
10

¿Es posible que una instancia de objeto PHP se destruya/desarme? Supongamos que tengo una clase que representa un archivo, y luego elimino ese archivo utilizando la clase. ¿Puedo de alguna manera desarmar la instancia desde uno de sus propios métodos?¿Puede una instancia de clase autodestruirse?

$file = new FileClass(); 

$file->copy('/some/new/path/'); 
$file->delete(); 

// ... at this point $file would be seen as unset. 
+1

dio un "sí-y-aquí-es-how" respuesta a una pregunta en esencia similar aquí - http://stackoverflow.com/a/21367011/1537018 –

Respuesta

14

No, no es posible destruir una clase desde dentro que no es lógica. unset($this) no funcionará (al menos no como se esperaba).

¿Por qué no se utiliza

unset($file); 

y define una función __destruct en la que realiza las tareas que se pueden realizar normalmente en delete?

+0

Esto fue algo que he considerado. El único problema con este enfoque sería, por supuesto, la legibilidad. Mirando hacia atrás a este código 5 años más tarde, o alguien que lo mira por primera vez, no tendría forma de saber que llamar a unset() en realidad estaba borrando el archivo. – Wilco

+1

Creo que esta es realmente la mejor solución que se puede encontrar, así que la voy a marcar como la respuesta aceptada. – Wilco

0

Esa es la única solución que se me ocurre:

function delete($var_name) { 
    unset($GLOBALS[$var_name]); 
} 

entonces usted:

$file->delete('file'); 

De todos modos, una clase no puede suicidio (sin ayuda del exterior).

+6

No funcionará si '$ file' no está en el alcance global aunque –

+0

agregando' global $ {var_name}; 'debería resolver eso – xorinzor

+1

Incrementando el alcance de un valor para que la basura recogida sea al revés. Hacerlo global causa conflictos con cualquier valor existente del mismo nombre, además de permitir que más código acceda, y por lo tanto dependa del valor. Esto hace que * sea más difícil de eliminar. Su solución eliminará el valor, junto con cualquier otro archivo "global" (preexistente o aún por agregar), y romperá cualquier otro usuario de cualquiera de estos valores. – Warbo

4

Alternativamente, se puede limitar el alcance del archivo $ por lo que se recoge la basura cuando ya no se usa:

call_user_func(function() { 
    $file = new FileClass(); 
    $file->copy('/some/new/path/'); 
    $file->delete(); 
}); 

// ... at this point $file would be seen as unset. 
Cuestiones relacionadas