Maison >développement back-end >tutoriel php >Analyser le mot-clé self de PHP

Analyser le mot-clé self de PHP

步履不停
步履不停original
2019-06-27 16:25:252636parcourir

Analyser le mot-clé self de PHP

Quelqu'un dans le groupe PHP a posé des questions sur l'utilisation du mot-clé self La réponse est relativement évidente : vous ne pouvez pas utiliser this pour appeler des fonctions non membres au sein d'un membre statique. fonction, mais vous pouvez utiliser selfAppeler des fonctions/variables/constantes membres statiques ; d'autres fonctions membres peuvent utiliser self pour appeler des fonctions membres statiques et des fonctions membres non statiques. Au fur et à mesure que la discussion s'approfondissait, j'ai découvert que self n'était pas si simple. Compte tenu de cela, cet article compare et différencie d'abord plusieurs mots-clés, puis résume l'utilisation de self. La différence entre

et parent, static et this

Pour bien comprendre self, il faut le distinguer de parent, static et this ouvert. Des comparaisons sont faites ci-dessous. La distinction entre

parent

self et parent est relativement simple : parent fait référence à la méthode (ou variable) cachée de la classe parent/classe de base, et self Référence à sa propre méthode (ou variable). Par exemple, le constructeur de la classe parent est appelé dans le constructeur :

class Base {
    public function __construct() {
        echo "Base contructor!", PHP_EOL;
    }
}

class Child {
    public function __construct() {
        parent::__construct();
        echo "Child contructor!", PHP_EOL;
    }
}

new Child;
// 输出:
// Base contructor!
// Child contructor!

static

staticLe but général est de modifier la fonction ou la variable pour en faire une fonction de classe et une classe variable, et elle peut également être modifiée dans la fonction. Les variables prolongent leur durée de vie tout au long de la durée de vie de l'application. Mais son association avec self est une nouvelle utilisation introduite depuis PHP 5.3 : la liaison statique retardée.

Avec la fonction de liaison statique retardée de static, la classe appartenant peut être déterminée dynamiquement au moment de l'exécution. Par exemple :

class Base {
    public function __construct() {
        echo "Base constructor!", PHP_EOL;
    }

    public static function getSelf() {
        return new self();
    }

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

    public function selfFoo() {
        return self::foo();
    }

    public function staticFoo() {
        return static::foo();
    }

    public function thisFoo() {
        return $this->foo();
    }

    public function foo() {
        echo  "Base Foo!", PHP_EOL;
    }
}

class Child extends Base {
    public function __construct() {
        echo "Child constructor!", PHP_EOL;
    }

    public function foo() {
        echo "Child Foo!", PHP_EOL;
    }
}

$base = Child::getSelf();
$child = Child::getInstance();

$child->selfFoo();
$child->staticFoo();
$child->thisFoo();

Le résultat du programme est le suivant :

Base constructor!
Child constructor!
Base Foo!
Child Foo!
Child Foo!

En termes de références de fonction, la différence entre self et static est : pour les fonctions membres statiques, self pointe vers la classe actuelle du code, static pointe vers la classe appelante ; pour les fonctions membres non statiques, self supprime le polymorphisme et pointe vers la fonction membre de la classe actuelle static est équivalent à this. , qui pointe dynamiquement vers la fonction de la classe appelante. Les trois mots-clés

parent, self et static sont très intéressants à regarder ensemble. Ils pointent respectivement vers la classe parent, la classe actuelle et la sous-classe, qui ont un peu un ". saveur passée, présente et future.

this

self et this sont les combinaisons les plus discutées et les plus susceptibles d'être mal utilisées. Les principales différences entre les deux sont les suivantes :

  1. this ne peut pas être utilisé dans les fonctions membres statiques, self peut
  2. accéder aux fonctions/variables membres statiques, Il est recommandé d'utiliser pour self au lieu de $this:: ou $this-> ;
  3. ne peut pas utiliser self pour accéder aux variables membres non statiques, uniquement this;
  4. this À utiliser lorsque l'objet a été instancié, self n'a pas cette restriction ;
  5. est utilisé dans une fonction membre non statique, self supprime le comportement polymorphe et fait référence à la fonction de classe actuelle ; et la référence this appelle la fonction de remplacement de la classe (le cas échéant). Les utilisations de

self

Après avoir lu les différences entre les trois mots-clés ci-dessus, l'utilisation de self est-elle immédiatement apparente ? Pour résumer en une phrase, c'est-à-dire : self pointe toujours vers "la classe actuelle (et l'instance de classe)". En détail, c'est :

  1. remplace le nom de la classe et fait référence aux variables membres statiques et aux fonctions statiques de la classe actuelle
  2. supprime le comportement polymorphe et fait référence aux fonctions de la classe actuelle ; classe actuelle au lieu de sous-classes. Implémentation de la couverture

Slots

  1. Parmi ces mots-clés, seul this doit être ajouté avec le symbole $ et doit l'être. ajouté. Le trouble obsessionnel-compulsif signifie que c'est très inconfortable ;
  2. Les fonctions membres statiques ne peuvent pas appeler les fonctions membres non statiques via $this->, mais elles peuvent être appelées via self::, et elles peuvent toujours fonctionner correctement. sans utiliser $this-> dans la fonction appelante. Ce comportement semble se comporter différemment dans différentes versions de PHP. C'est ok dans la version 7.3 actuelle
  3. sorties self dans les fonctions statiques et les fonctions non statiques. Ils sont tous string(4) "self", la sortie du puzzle
  4. return $this instanceof static::class; aura des erreurs grammaticales, mais les deux façons d'écrire suivantes sont normales :

    $class = static::class;
    return $this instanceof $class;
    // 或者这样:
    return $this instanceof static;

    Alors pourquoi ce? !

Pour plus d'articles techniques liés à PHP, veuillez visiter la colonne Tutoriel PHP pour apprendre !

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

Articles Liés

Voir plus