Maison >développement back-end >tutoriel php >La différence entre new self() et new static() en PHP

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

小云云
小云云original
2018-01-26 11:05:341296parcourir

Qu'il s'agisse de new static() ou de new self(), un nouvel objet est nouveau. Cet article vous présente principalement la différence entre new self() et new static() en PHP orienté objet. Les amis dans le besoin peuvent s'y référer.

La différence est la suivante :

Clarifiez d'abord la conclusion. En PHP, self pointe vers la classe qui définit la méthode actuellement appelée, et static pointe vers la classe qui appelle la méthode statique actuelle. .

Ensuite, un exemple sera utilisé pour prouver le résultat ci-dessus

class A 
{
 public static $_a = 'Class A';

 public static function echoProperty()
 {
 echo self::$_a . PHP_EOL;
 }
}

class B extends A 
{
 public static $_a = 'Class B';
}

$obj = new B();
B::echoProperty();//输出 Class A

La raison pour laquelle c'est le cas est que self:: ou __CLASS__ est utilisé pour faire référence statiquement à la classe actuelle , selon la définition. Dans la classe où la méthode est appelée, modifiez la méthode echoProperty de la classe A ci-dessus pour devenir :

class A 
{
 public static $_a = 'Class A';

 public static function echoProperty()
 {
 echo static::$_a . PHP_EOL;
 }
}
//再次调用B::echoProperty将输出 'CLASS B'

Afin d'éviter que la sous-classe ne remplace les propriétés statiques de la classe parent comme vu dans le premier exemple ci-dessus, utilisez les méthodes héritées pour toujours accéder aux propriétés statiques de la classe parent. PHP5.3 ajoute une nouvelle syntaxe : utilisez le mot-clé static au lieu du mot-clé self pour créer un point statique vers et revenir de. get_call_class(). La même classe, c'est-à-dire la classe qui appelle actuellement la méthode statique, ce mot-clé est également valide pour accéder à la méthode statique.

L'exemple suivant illustre mieux la différence entre new self() et new static() (cette dernière utilise la liaison statique tardive de PHP pour pointer vers la classe actuelle de la méthode appelante)

class A 
{
 public static function get_self() 
 {
 return new self();
 }

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

class B extends A {}

echo get_class(B::get_self()); // A
echo get_class(B::get_static()); // B
echo get_class(A::get_self()); // A
echo get_class(A::get_static()); // A

Recommandations associées :

Aperçu des principes de conception orientée objet PHP

Connaissances pratiques de base de PHP orienté objet

Tutoriel d'exemple de concept de base orienté objet PHP

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