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

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

藏色散人
藏色散人avant
2019-10-23 13:47:032716parcourir

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__ sont utilisés pour faire référence statiquement à la classe actuelle, selon sur la définition de la méthode appelée Dans la classe où elle se trouve, modifier 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 vue dans le premier exemple ci-dessus n'écrase les propriétés statiques de la classe parent, utilisez le mot-clé hérité. La méthode accède toujours 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 faire pointer static vers la même classe renvoyée. par get_call_class() , 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

Pour pour plus de connaissances sur PHP, 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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer