Quelle est la différence entre la classe PHP self et la classe statique ? Comment l'utiliser ?

藏色散人
Libérer: 2023-04-10 16:40:01
avant
3828 Les gens l'ont consulté

Pour la plupart des PHPers, les deux mots-clés PHP self et static ne sont pas inconnus. Nous apprenons à appeler les propriétés et méthodes statiques de la classe actuelle via self::xxxx. Et qu'en est-il de l'électricité statique ? Beaucoup de gens savent probablement seulement qu'il est utilisé pour définir une méthode statique et des mots-clés d'attribut de classe. self::xxxx这种方式来调用当前类的静态属性和方法。而 static 呢?想必很多人只知道它是用于定义一个静态方法和类属性关键词。

这也是我之前的认知。

现在我们来回顾一下这两个关键词的一些常见用法:

// self 用法 1 :调用静态成员属性
<?php
class Person
{
    protected static $maxAddressCount = 5; // 收获地址创建最大数量。

    public function test()
    {
        echo self::$maxAddressCount;
    }
}

$person = new Person();
$person->test();
Copier après la connexion
// self 用法 2 :调用静态方法
<?php
class Person
{
    protected static $maxAddressCount = 5; // 收获地址创建最大数量。

    protected static function getMaxAddressCount()
    {
        return self::$maxAddressCount;
    }

    public function test()
    {
        echo self::getMaxAddressCount();
    }
}

$person = new Person();
$person->test();
Copier après la connexion
// self 用法 3 :创建一个当前对象
<?php
// 单例示例
class Person
{
    private static $instance = null;

    private function __construct() {}

    final public static function getInstance() 
    {
        if (self::$instance == null) {
            self::$instance = new self;
        }
        return self::$instance;
    }

    public function test()
    {
        echo "hello world!";
    }
}

$person = Person::getInstance();
$person->test();
Copier après la connexion
关于 static 关键词的常见用法也在上面 3 个示例中得到综合体现。

我深信上面的用法,任何一个入门的 PHPer 都是非常熟悉的。现在我要讲的是以下两种方式:

new self() 与 new static() 的区别?
Copier après la connexion

我相信很多人都知道new self()创建一个当前类的对象,并不知道new static()也能创建一个当前类的对象。

关于new static()这种用法呢,在官方文档有说明。地址:https://www.php.net/manual/zh/language.oop5.late-static-bindings.php

PHP 官方把这种方式称为:后期静态绑定。

官方示例 1:

<?php
class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        self::who();
    }
}

class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test();
Copier après la connexion

因为 Class B 继承了 Class A。 A 与 B 都有一个静态方法who()。此时通过B::test()的时候,调用的实际上是 Class A 的who()方法。

因为子类 Class B 的静态方法who()属于在 Class A 之后的子类里面才定义的。而 PHP 的默认特性只允许调用最先定义的。

就这引出了后期静态绑定的概念。

官方示例 2:

<?php
class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        static::who(); // 后期静态绑定从这里开始
    }
}

class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test();
Copier après la connexion

我们把 Class A 里面的test()方法体的self更改为static

C'est aussi ma compréhension précédente.

Passons maintenant en revue quelques utilisations courantes de ces deux mots-clés :

rrreeerrreeerrreee

Les utilisations courantes du mot-clé statique sont également reflétées de manière exhaustive dans les 3 exemples ci-dessus.
Je crois fermement que l'utilisation ci-dessus est très familière à tout PHPer débutant. Maintenant, ce dont je veux parler, ce sont les deux manières suivantes :
rrreee

Je crois que beaucoup de gens savent que new self() crée un objet de la classe actuelle, mais ne savent pas new static () code> peut également créer un objet de la classe courante. À propos de l'utilisation de new static(), elle est expliquée dans la documentation officielle. Adresse : https://www.php.net/manual/zh/langage.oop5.late-static-bindings.php

🎜PHP appelle officiellement cette méthode : liaison statique tardive. 🎜🎜🎜Exemple officiel 1 : 🎜rrreee🎜Parce que la classe B hérite de la classe A. A et B ont tous deux une méthode statique who(). À l'heure actuelle, lors du passage de B::test(), ce qui est réellement appelé est la méthode who() de la classe A. 🎜🎜Parce que la méthode statique who() de la sous-classe Classe B est définie dans la sous-classe après la classe A. La fonctionnalité par défaut de PHP permet uniquement d'appeler le premier défini. 🎜🎜Cela conduit au concept de liaison statique tardive. 🎜🎜Exemple officiel 2 :🎜rrreee🎜Après avoir modifié le self du corps de la méthode test() dans la classe A en static, static représente Cela pointe toujours vers la classe appelante. C’est-à-dire bien que la méthode définie dans la classe parent Classe A soit en conflit avec la sous-classe du même nom. Cependant, lorsque la sous-classe l'appelle, elle passe automatiquement à la méthode statique du même nom de la sous-classe. Cela dépend de l'appelant. 🎜🎜Vous pouvez comprendre en exécutant les deux exemples ci-dessus. 🎜🎜La raison de cette rubrique. Ce problème est survenu parce que j'ai dû hériter de la méthode singleton pendant le fonctionnement réel. Cette fonctionnalité est donc impliquée. 🎜🎜🎜Apprentissage recommandé : "🎜Tutoriel vidéo 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!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!