Maison  >  Article  >  développement back-end  >  À propos de la relation entre les références d'objets et les destructeurs en php

À propos de la relation entre les références d'objets et les destructeurs en php

黄舟
黄舟original
2017-07-02 10:27:361214parcourir

En php, le constructeur et le destructeur appartiennent tous deux à des méthodes magiques Par exemple, si le constructeur est dans une certaine classe, quand ceci. classe Il sera automatiquement appelé lors de son instanciation, et le destructeur est automatiquement appelé lorsque l' objet de cette classe est détruit. Par défaut, il est automatiquement appelé à la fin de l'exécution du programme.

Si nous faisons une référence à l'objet, alors l'appel du destructeur changera également si un seul objet est instancié, comme $obj, alors aussi longtemps. comme là $obj = null ; cette instruction signifie que l'objet $obj est détruit à ce moment-là, le destructeur sera appelé à l'avance, mais les autres objets de cette classe ne seront pas affectés.

Si nous utilisons $obj1 = &$obj; c'est-à-dire que nous utilisons le symbole & pour faire référence à l'opération d'affectation, cette opération ne générera pas de nouvelle référence à l'objet. -appelés deux objets utilisent en fait le même espace mémoire, lorsque l'un de $obj ou $obj1 est détruit, l'autre disparaîtra également en même temps.

Si vous utilisez l'opération $obj1 = $obj;, il s'agit d'une opération d'affectation directe, qui générera une nouvelle référence à un objet lorsque $obj ou $obj1 est détruit. le destructeur ne sera pas exécuté et l'autre objet peut toujours être utilisé normalement. Le destructeur ne sera pas exécuté tant que les deux ne seront pas détruits. Cela montre que les deux ont une relation unifiée, pas deux objets, mais une relation de référence. ne crée pas de nouvel objet qui n'interfère pas les uns avec les autres, mais fait référence à un objet. Lorsque les membres d'un objet changent, les membres de l'autre objet changent en conséquence et sont liés les uns aux autres, donc l'affectation directe avec = est entre. = Une situation entre l'opération & et l'opération de clonage.

Si vous effectuez une opération de clonage, c'est $obj1 = clone $obj ; dans cette opération, $obj1 et $obj sont deux objets sans aucune interférence. La modification d'un membre n'affecte pas. un autre membre. Dans le clone, tous les attributs valeurs de $obj1 sont exactement les mêmes que $obj. Il s'agit d'une vraie réplication. Lors de la copie, vous pouvez également écrire la méthode magique clone() dans la classe pour donner une nouvelle valeur à certains attributs de $obj1 ou pour bloquer les valeurs indésirables. Voici un exemple simple de la méthode d'implémentation.

class Player{
    public $name;
    function destruct(){
        echo "Destroying ".$this->name."<br />";
    }
    //设置魔术方法,赋值时会自动调用这里的属性值,作用是初始化值,或屏蔽不想要的值
    function clone(){
        $this->name="gbcs";
    }
}
$james=new Player();
$james2=clone $james;
echo $james2->name.&#39;<br />&#39;;
$james->name="james";
$james2->name="james2";
echo $james->name.&#39;<br />&#39;;
$james=null;
echo $james2->name.&#39;<br />&#39;;

Les résultats d'exécution sont les suivants :

Selon les résultats de l'exécution, on peut clairement voir que clone génère deux objets indépendants l'un de l'autre, et la méthode magique clone() est également appelée à partir de la séquence d'exécution du destructeur. les deux objets sont détruits séparément et la signification de l'affectation est différente.

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