Maison  >  Article  >  développement back-end  >  Quelle est la différence entre new self() et new static() en PHP orienté objet

Quelle est la différence entre new self() et new static() en PHP orienté objet

巴扎黑
巴扎黑original
2018-05-15 17:03:412642parcourir

La différence entre new self() et new static() en PHP orienté objet est la suivante : l'instance renvoyée par new self() est inchangée et renvoie toujours une instance de la même classe que celle renvoyée par new ; static() est déterminé par l'appelant.

Quelle est la différence entre new self() et new static() en PHP orienté objet

new static() est une nouvelle fonctionnalité introduite dans PHP5.3. Qu'il s'agisse de new static() ou de new self(), un nouvel objet est nouveau. Quelle est la différence entre les objets produits par new dans ces deux méthodes ? L’article suivant vous le présentera.

La différence entre new self() et new static() en PHP orienté objet

Afin d'explorer cette question, créons d'abord un code simple :

class Father {

    public function getNewFather() {
        return new self();
    }

    public function getNewCaller() {
        return new static();
    }

}

$f = new Father();

print get_class($f->getNewFather());
print get_class($f->getNewCaller());

Notez que la méthode get_class() dans le code ci-dessus est utilisée pour obtenir le nom de classe à laquelle appartient l'instance.

Le résultat ici est le suivant : quel que soit l'appel à getNewFather() ou getNewCaller(), une instance de la classe Father est renvoyée.

Le résultat imprimé est : FatherFather

À ce stade, il semble qu'il n'y ait aucune différence entre new self() et new static(). Continuons :

class Sun1 extends Father {

}

class Sun2 extends Father {

}
$sun1 = new Sun1();$sun2 = new Sun2();
print get_class($sun1->getNewFather());
print get_class($sun1->getNewCaller());
print get_class($sun2->getNewFather());
print get_class($sun2->getNewCaller());

Regardez le code ci-dessus. Maintenant, la classe Father a deux sous-classes. Puisque les getNewFather() et getNewCaller() de la classe Father sont publiques, les sous-classes héritent de ces deux méthodes.

Le résultat imprimé est :

FatherSun1FatherSun2

Nous avons constaté que qu'il s'agisse de Sun1 ou de Sun2, l'objet renvoyé en appelant getNewFather() est une instance de la classe Father, tandis que getNewCaller() return est l’instance de l’appelant.

C'est-à-dire que $sun1 renvoie une instance de la classe Sun1 et $sun2 renvoie une instance de la classe Sun2.

Maintenant, il me semble comprendre la différence entre new self() et new static().

Tout d'abord, leur différence ne peut se refléter que dans l'héritage. S'il n'y a pas d'héritage, alors il n'y a pas de différence entre les deux.

Ensuite, l'instance renvoyée par new self() est inchangée pendant des milliers d'années, peu importe qui l'appelle, elle renverra une instance de la même classe, tandis que new static() est déterminée par l'appelant.

L'appelant de $sun1->getNewCaller() ci-dessus est $sun1, n'est-ce pas ! $sun1 est une instance de la classe Sun1, donc ce qui est renvoyé est une instance de la classe Sun1. La même raison pour $sun2 ne sera pas répétée.

Pour plus de connaissances connexes, veuillez visiter le Site Web PHP chinois ! !

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