Was ist der Unterschied zwischen der PHP-Klasse self und static? Wie benutzt man sie?

藏色散人
Freigeben: 2023-04-10 16:40:01
nach vorne
3841 Leute haben es durchsucht

Für die meisten PHPer sind die beiden PHP-Schlüsselwörter self und static nicht unbekannt. Wir lernen, die statischen Eigenschaften und Methoden der aktuellen Klasse über self::xxxx aufzurufen. Und was ist mit statischer Aufladung? Viele Leute wissen sicher, dass es zum Definieren einer statischen Methode und von Schlüsselwörtern für Klassenattribute verwendet wird. self::xxxx这种方式来调用当前类的静态属性和方法。而 static 呢?想必很多人只知道它是用于定义一个静态方法和类属性关键词。

这也是我之前的认知。

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

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

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

$person = new Person();
$person->test();
Nach dem Login kopieren
// 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();
Nach dem Login kopieren
// 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();
Nach dem Login kopieren
关于 static 关键词的常见用法也在上面 3 个示例中得到综合体现。

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

new self() 与 new static() 的区别?
Nach dem Login kopieren

我相信很多人都知道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();
Nach dem Login kopieren

因为 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();
Nach dem Login kopieren

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

Das ist auch mein bisheriges Verständnis.

Lassen Sie uns nun einige häufige Verwendungen dieser beiden Schlüsselwörter betrachten:

rrreeerrreeerrreee

Die häufigen Verwendungen des statischen Schlüsselworts werden auch in den obigen drei Beispielen umfassend widergespiegelt.
Ich bin fest davon überzeugt, dass jeder PHP-Einsteiger mit der oben genannten Verwendung bestens vertraut sein wird. Worüber ich nun sprechen möchte, sind die folgenden zwei Möglichkeiten:
rrreee

Ich glaube, viele Leute wissen, dass new self() ein Objekt der aktuellen Klasse erstellt, kennen aber new static nicht () code> kann auch ein Objekt der aktuellen Klasse erstellen. Über die Verwendung von new static() wird in der offiziellen Dokumentation erklärt. Adresse: https://www.php.net/manual/zh/sprache.oop5.late-static-bindings.php

🎜PHP nennt diese Methode offiziell: späte statische Bindung. 🎜🎜🎜Offizielles Beispiel 1: 🎜rrreee🎜Weil Klasse B Klasse A erbt. Sowohl A als auch B haben eine statische Methode who(). Zu diesem Zeitpunkt wird bei der Übergabe von B::test() tatsächlich die Methode who() der Klasse A aufgerufen. 🎜🎜Weil die statische Methode who() der Unterklasse Klasse B in der Unterklasse nach Klasse A definiert ist. Die Standardfunktion von PHP erlaubt nur den Aufruf der ersten definierten Funktion. 🎜🎜Dies führt zum Konzept der späten statischen Bindung. 🎜🎜Offizielles Beispiel 2:🎜rrreee🎜Nachdem wir den self des test()-Methodenkörpers in Klasse A in static geändert haben, stellt static dar zeigt immer auf die aufrufende Klasse. Das heißt, obwohl die in der übergeordneten Klasse A definierte Methode mit der gleichnamigen Unterklasse in Konflikt steht. Wenn die Unterklasse sie jedoch aufruft, wechselt sie automatisch zur gleichnamigen statischen Methode der Unterklasse. Hängt vom Anrufer ab. 🎜🎜Sie können es verstehen, indem Sie die beiden oben genannten Beispiele ausführen. 🎜🎜Der Grund für diesen Abschnitt. Dieses Problem trat auf, weil ich die Singleton-Methode während des tatsächlichen Betriebs erben musste. Daher ist diese Funktion beteiligt. 🎜🎜🎜Empfohlenes Lernen: „🎜PHP-Video-Tutorial🎜“🎜🎜

Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen der PHP-Klasse self und static? Wie benutzt man sie?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:segmentfault.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage