Maison  >  Article  >  développement back-end  >  Résoudre un problème avec le destructeur php

Résoudre un problème avec le destructeur php

黄舟
黄舟original
2017-07-02 10:15:411097parcourir

Avec le développement généralisé de la programmation orientée objet, la programmation orientée objet a révélé de nombreux problèmes intéressants. Je pense que de nombreux débutants entreront en contact avec deux fonctions lors de l'apprentissage du PHP orienté objet, du constructeur et du destructeur. Il semble que les constructeurs soient plus utilisés et les destructeurs moins (par rapport à l'expérience limitée en programmation des débutants, il en va de même pour l'auteur.) Fonctionnellement, le constructeur est appelé lorsque crée l'objet, et le le destructeur est appelé La fonction est appelée lorsque l'objet est détruit, et il n'est pas nécessaire de l'appeler spécialement.

Les tâches que les destructeurs gèrent souvent sont certaines tâches de libération de ressources. Par exemple, fopen() est appelé avant, fclose() est appelé ici, imagecreatefromjepg() est appelé avant et imagedestory() est appelé ici. Ce sont quelques exemples courants qui, bien entendu, ne se limitent pas à ceux-ci. Nous pouvons le traiter comme une fonction ordinaire qui sera exécutée lorsque l'objet sera détruit ou que le script sera terminé .

Tant de verbosité, soulevons le plus tôt possible la question principale d'aujourd'hui :

<?php
class Test{
    public function destruct(){
        echo "执行析构函数";
    }
 }
$test1=new Test;
$test2=$test3=$test1;
unset($test1);
echo "<hr/>";

Quel est le résultat de l'exécution de ce script ?

Avant de répondre à cette question, revenons sur les mots que j'ai marqués ci-dessus. Nous pouvons tenir pour acquis qu'avant la ligne de séparation de sortie unset($test1) , cela appellera le destructeur et affichera le texte Quant à $test2,$test3 devrait appeler le destructeur une fois le script exécuté. En d’autres termes, un paragraphe de texte sera affiché au-dessus de la ligne de séparation et deux paragraphes de texte seront affichés en dessous de la ligne de séparation. En ce moment, vous pouvez être un peu fier, après tout, vous savez quand appeler le destructeur. Mais est-ce vraiment le cas ? Nous pouvons jeter un œil aux résultats de l’exécution.

Hé, putain, pourquoi tu viens de sortir une phrase ? ? ?

En fait, nous avons négligé une condition préalable importante, à savoir que l'affectation par défaut des

objets est l'affectation de référence . Beaucoup de gens ne l'ont pas remarqué, et j'espère que les débutants pourront y prêter plus d'attention.

Puisqu'il s'agit d'une affectation de référence, combinée à notre compréhension des variables ordinaires, nous avons rapidement pensé que les trois noms de variables pointaient vers la même adresse de stockage. Alors si tel est le cas, quel rôle

unset($test1) joue ? ? ? Détruire la variable pointant vers l'adresse de stockage ou détruire le contenu stocké dans l'adresse de stockage ?

Si vous savez utiliser la fonction unset(), veuillez ignorer ce paragraphe.

Considérant ce problème douloureux, pourquoi ne pas consulter le manuel.

La même chose est passée par référence, seul le nom de la variable pointant vers l'adresse de stockage est détruit. Combiné avec la fonction normale de unset(), nous pouvons le décrire ainsi,

Lorsque plusieurs noms de variables ou noms d'objets pointent vers une adresse de stockage, la fonction unset() est uniquement de détruire les pointeurs de la variable Noms et adresses de stockage Lorsqu'il n'y a que Pour un nom de variable ou un nom d'objet, unset détruit le contenu à l'adresse de stockage spécifiée.

On peut imaginer que le véritable contenu de stockage soit un téléviseur. Plusieurs personnes (plusieurs noms de variables ou noms d'objets) regardent une télévision. Après unset(), personne n'a arrêté de regarder et est parti, mais la télévision était toujours allumée. Lorsqu'une seule personne regarde la télévision, après unset(), lorsque la personne part, la télévision doit être éteinte, ce qui libère l'espace de stockage occupé. Si cette partie du contenu vous intéresse, vous pouvez également consulter "Trois méthodes d'implémentation de PHP

Fonction récursive".

Bon, revenons au sujet. Après

unset($test1), l'objet d'origine est toujours là. Lorsque la ligne de séparation est affichée, le script est exécuté et le destructeur est appelé. Puisqu’il n’y a qu’un seul objet, l’appel du destructeur n’est appelé qu’une seule fois. Il est naturel de produire les résultats ci-dessus.

Plusieurs autres questions intéressantes connexes : Il existe de nombreuses façons d'appeler le destructeur dans le programme. Que l'objet soit défini sur null ou false, les autres objets ne sont pas affectés. C'est encore différent des variables ordinaires. (L'effet de la fonction unset() est le même). Si vous êtes intéressé, vous pouvez l'essayer.

Autre chose embarrassante : nous savons tous que le constructeur peut utiliser construct(), mais nous ignorons le constructeur du même nom. Donc, tout le monde devrait y prêter attention.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn