2010-07-15 5 views
10

Est-il possible qu'une instance d'objet PHP se détruise/se désactive? Dites que j'ai une classe qui représente un fichier, puis je supprime ce fichier en utilisant la classe. Puis-je d'une manière ou d'une autre supprimer l'instance de l'une de ses propres méthodes?Une instance de classe peut-elle s'autodétruire?

$file = new FileClass(); 

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

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

a donné une réponse « oui-et-ici-est-faire » à une question essentiellement similaire ici - http://stackoverflow.com/a/21367011/1537018 –

Répondre

14

Non, il n'est pas possible de détruire une classe dans laquelle elle est illogique. unset($this) ne fonctionnera pas (au moins pas comme prévu).

Pourquoi utilisez-vous pas

unset($file); 

et de définir une fonction __destruct dans laquelle vous effectuez les tâches que vous le feriez normalement effectuer dans delete?

+0

C'était quelque chose que j'ai considéré. Le seul problème avec cette approche serait bien sûr la lisibilité. En regardant ce code 5 ans plus tard, ou quelqu'un qui le regarde pour la première fois, n'aurait aucun moyen de savoir que l'appel de unset() supprimait réellement le fichier. – Wilco

+1

Je pense que c'est vraiment la meilleure solution que l'on puisse trouver, donc je vais la marquer comme la réponse acceptée. – Wilco

0

C'est la seule solution que je peux penser à:

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

Ensuite, vous faites:

$file->delete('file'); 

Quoi qu'il en soit, une classe ne peut pas le suicide (sans l'aide de l'extérieur).

+6

Ne fonctionnera pas si '$ file' n'est pas dans la portée globale alors que –

+0

ajouter' global $ {$ var_name}; 'devrait résoudre cela – xorinzor

+1

Augmenter la portée d'une valeur afin de l'avoir ramassé est à rebours. Le rendre global provoque des conflits avec toutes les valeurs existantes du même nom, plus il permet à plus de code d'accéder, et donc de dépendre, de la valeur. Cela rend * plus difficile * à enlever. Votre solution supprimera la valeur, ainsi que tout autre "fichier" global (préexistant ou encore à ajouter), et casse tous les autres utilisateurs de l'une de ces valeurs. – Warbo

4

Vous pouvez également limiter la portée du fichier $ il se ramasse-miettes quand ne sont plus utilisés:

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

// ... at this point $file would be seen as unset. 
Questions connexes