68 votes

Php Destructors

S'il vous plaît, donnez-moi des exemples concrets dans lesquels vous deviez utiliser __destruct dans vos cours.

45voto

ircmaxell Points 74865

Ok, depuis ma dernière réponse, apparemment, n'a pas frappé la marque, laissez-moi essayer ce nouveau. Il y a beaucoup de ressources et d'exemples sur internet à ce sujet. En faisant un peu de recherche et de navigation d'autres cadre du code et vous verrez quelques très bons exemples...

N'oubliez pas que juste parce que PHP va fermer des ressources en cas de résiliation pour vous ne signifie pas qu'il est mauvais pour explicitement les fermer quand vous n'en avez plus besoin (ou bon de ne pas les fermer)... Cela dépend du cas d'utilisation (est-il utilisé jusqu'à la fin, ou est-il un appel dès le début, et puis pas besoin de nouveau pour le reste de l'exécution)...

Maintenant, nous savons qu' __destruct est appelée lorsque l'objet est détruit. Logiquement, qu'advient-il si l'objet est détruit? Eh bien, cela signifie qu'il n'est plus disponible. Si si, il a des ressources de l'ouvrir, n'est-il pas logique de fermer ces ressources, comme on l'a détruit? Bien sûr, dans la moyenne de la page web, la page va mettre fin peu de temps après, afin de laisser PHP fermer n'est généralement pas terrible. Cependant, qu'advient-il si pour une raison quelconque, le script est longue? Ensuite, vous avez une fuite de ressources. Alors pourquoi ne pas simplement près tout quand vous n'en avez plus besoin (ou compte tenu de la portée de l'destructeur, quand elle n'est plus disponible)?

Voici quelques exemples dans le monde réel les cadres:

  1. Lithium lithium\net\classes Socket
  2. Kohana Memcached de Pilote
  3. Joomla FTP de mise en Œuvre
  4. Zend Cadres de Messagerie SMTP de Transport de Classe
  5. CodeIgniter est TTemplate Classe
  6. Un bon Filtre Helper pour le Gâteau
  7. Google Groupes Thread sur l'utilisation des Destructeurs De la Classe Session de Symfony

La chose intéressante est que Kohana conserve la trace des balises, de sorte qu'il ne peut supprimer par "espace de noms" plus tard (au lieu de simplement vider le cache). Elle utilise donc le destructeur de rincer les changements apportés à la dur de stockage.

Le CodeIgniter classe aussi quelque chose d'intéressant en cela qu'il ajoute les informations de débogage pour le flux de sortie dans le destructeur. Je ne dis pas que c'est bien, mais c'est un exemple d'encore une autre utilisation...

Personnellement, j'utilise les destructeurs chaque fois que j'ai longtemps processus en cours d'exécution sur mon contrôleur maître. Dans le constructeur, je check pour un pid le fichier. Si ce fichier existe (Et de ses processus est toujours en cours d'exécution), je lève une exception. Si non, j'ai créer un fichier avec les processus en cours d'identification. Ensuite, dans le destructeur-je supprimer ce fichier. Il est donc plus sur le nettoyage après lui-même que de simplement libérer des ressources...

22voto

Jan Turoň Points 6598

Il existe une autre utilisation pratique pour générer une page HTML

 class HTMLgenerator {
  function __construct() {
    echo "<html><body>";
  }
  function __destruct() {
    echo "</body></html>";
  }
}
 

Avec cette classe, vous pouvez écrire

 $html = new HTMLgenerator();
echo "Hello, world!";
 

Et le résultat est

 <html><body>Hello, world!</body></html>
 

7voto

VDVLeon Points 797

Par exemple:

 <?php
class Session
{
    protected $data = array();

    public function __construct()
    {
        // load session data from database or file
    }

    // get and set functions

    public function __destruct()
    {
        // store session data in database or file
    }
};
 

C'est une bonne raison d'utiliser destruct. Vous empêchez toujours de lire et d'écrire dans une source de session et vous ne le faites qu'au début et à la fin.

4voto

edorian Points 22780

Vous avez raison, __destruct est la plupart du temps inutiles pour le court exécution des scripts php. Connexions de base de données, les descripteurs de fichiers et ainsi de suite fermer sur le script de sortie ou parfois même plus tôt si les variables exécuter hors de portée.

Un exemple est, je pense, l'écriture des journaux de la base de données. Puisque nous ne voulons pas le feu une requête par l'entrée de journal est créé quelque part dans le script, nous avons écrit la "écrire db" dans le cadre de l' __la destruction de la classe de log ainsi, lorsque le script se termine tout est inséré dans la base de données à un.

Autre exemple: Si vous permettre à un utilisateur de télécharger des fichiers le destructeur est parfois un des endroits agréables pour supprimer les fichiers temporaires (dans le cas où quelque chose va mal dans le script, ça au moins nettoyé)

Mais même pour les descripteurs, il peut être utile. J'ai travaillé sur une application qui n'utiliser l'ancien fopen etc. appels enveloppé dans des objets et lors de l'utilisation de ces sur de grandes filetrees php courir hors de descripteurs, tôt ou tard, de sorte que le nettoyage pendant que le script était en cours d'exécution n'était pas seulement belle, mais nécessaire.

4voto

NawaMan Points 10266

J'ai créer une page php ce qui va générer un film informations de fichier jpg. Cette page aura pour recueillir quelques informations et exécuter inkscape pour convertir le modèle (fichier svg) pour un png avant de le convertir en jpg). Le svg contenir des liens vers d'autres de l'image qui doit être un fichier. Donc ma page de téléchargement de fichiers nécessaires dans un dossier temporaire, convertir le fichier svg. À la fin, le dossier temporaire doit être supprimé.

J'ai mis le dossier temporaire de suppression dans le destructeur. Avant il peut y avoir plusieurs raison, la page se termine inattendu et la seule chose que je peux être sûr, c'est que destructeur sera appel lorsque la page de sortie.

Espérons que cette aide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X