Maison  >  Article  >  développement back-end  >  Pourquoi PHP exécute-t-il le destructeur d'un objet instancié en premier ?

Pourquoi PHP exécute-t-il le destructeur d'un objet instancié en premier ?

黄舟
黄舟original
2017-07-02 10:44:571655parcourir

Question 1 : La question est telle que mentionnée, j'ai fait le test moi-même

class Obj{        
public $i;        
        public function construct($t){            
        $this->i = $t;            
        echo "执行构造函数$this->i";            
        echo "<br>";
        }        
        public function destruct(){            
        echo "执行析构函数$this->i";            
        echo "<br>";
        }
    }
    $obj1 = new Obj(1);
    $obj2 = new Obj(2);

执行构造函数1执行构造函数2执行析构函数2执行析构函数1

Question 2 : La méthode constructeur de la classe parent dans la sous-classe juste pour initialiser le parent classe ? Générer des objets de la classe parent ?

======================================== MISE À JOUR === == =================================

Trouver une déclaration plus compréhensive :

L'utilisation du tas ou de la pile pour stocker les données est déterminée par le moteur PHP, et les développeurs PHP n'ont pas besoin de s'en soucier.
Redirection :
Dans l'implémentation de Zend Engine en PHP5, toutes les valeurs ​​​​sont alloués de l'espace sur le tas et sont gérés via un comptage de références et un garbage collection.
Le moteur Zend de PHP5 utilise principalement des pointeurs vers les structures zval pour exploiter les valeurs, et dans de nombreux endroits, il fonctionne même via des pointeurs secondaires de zval.
Et dans l'implémentation Zend In the Engine de PHP7, la valeur est manipulée via la structure zval elle-même (pas un pointeur
La nouvelle structure zval est directement stockée sur la pile de la VM, dans le bucket de la HashTable et dans). l'emplacement d'attribut.
Cela réduit considérablement le nombre de Les opérations d'allocation et de libération de mémoire sur le tas évitent également le comptage de références et le garbage collection de valeurs simples

==========. ============ =================UPDATE1===================== ============ ======

Trouver la description spécifique

$p1 = new Person(); nom de l'objet dans la mémoire de la pile new Person() L'objet réel est dans la mémoire du tas Veuillez consulter la figure ci-dessous pour plus de détails :

Pourquoi PHP exécute-t-il le destructeur dun objet instancié en premier ?

Cela explique pourquoi l'objet instancié en premier est. publié plus tard

new Person(); renvoie en fait une référence à un objet, puis la référence est affectée à $p1. $p1 est une variable stockée dans la pile et un pointeur pointant vers l'entité allouée par le. objet dans le tas

Cela explique également que les variables de stockage sous-jacentes de PHP ont une table de symboles de hachage pour maintenir le cycle de vie de la variable. La table des symboles contient des paires clé=>valeur, et la clé est la valeur. nom de la variable. , la clé pointe vers la structure zval, c'est-à-dire la première adresse de valeur

L'exécution du constructeur et du destructeur utilise en fait une structure de pile puisque Obj (2) est créé plus tard, c'est le cas. situé en haut de la pile, selon l'ordre "premier entré, dernier sorti" sur la pile, lorsqu'il est détruit, Obj (2) est détruit en premier.

Après avoir lu la question de l'affiche, j'avais beaucoup de questions. Je voulais aussi savoir pourquoi pas

执行构造函数1
执行构造函数1
执行析构函数2
执行析构函数2

PHP 5 a introduit le concept de destructeur, qui est similaire aux autreslangages orientés objet tels que le C++. Le destructeur sera exécuté lorsque toutes les références à un objet seront supprimées ou lorsque l'objet sera explicitement détruit

C'est-à-dire que le processus est comme ceci

Obj(1) 启动,申请自己的内存空间与上下文环境
Obj(2) 启动,申请自己的内存空间与上下文环境
Obj(2) 销毁,垃圾回收
Obj(1) 销毁,垃圾回收
C'est Obj ( 1) Le même que premier entré, dernier sorti, il est instancié plus tard, donc il est détruit en premier objet de classe ?

Même manuel. L'héritage est une fonctionnalité de programmation bien connue et le modèle objet de PHP utilise également l'héritage. L'héritage affectera la relation entre les classes et les objets et les objets.
----------------------------
Obj(1) Obj(2) Obj(2) Obj(1)
----------------------------

Par exemple, lors de l'extension d'une classe, la sous-classe héritera de toutes les méthodes publiques et protégées de la classe parent. À moins que la sous-classe ne remplace la méthode de la classe parent, la méthode héritée conservera sa fonctionnalité d'origine.

Les sous-classes peuvent appeler des méthodes de classe parent, et il n'y a pas d'instanciation des relations d'héritage

Mes réflexions :

Question 1 : Les variables contenant des références d'objet sont stockées sur la pile Oui, la pile est premier entré, dernier sorti, et la variable obj2 est détruite en premier avec obj1

Question 2 : Un seul objet de sous-classe sera généré

La première question : obj1 et obj2 sont évidemment stockés Dans la mémoire de pile, selon les caractéristiques de la mémoire de pile, premier entré, dernier sorti, lorsqu'il est détruit, obj2 est naturellement détruit en premier, c'est-à-dire que la destruction d'obj2 est exécutée en premier, puis obj1 est détruite, c'est-à-dire que la _desctruct d'obj1 est exécutée. Cela explique également votre problème de commande.

Le deuxième problème : L'objet de la classe parent ne sera pas généré. Lorsque vous instancierez une sous-classe, les méthodes publiques et protégées de la classe parent seront sur l'objet instancié. Vous pouvez donc appeler la méthode de la classe parent.

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