Heim  >  Artikel  >  Backend-Entwicklung  >  Was ist der Unterschied zwischen der PHP-Klasse self und static? Wie benutzt man sie?

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

藏色散人
藏色散人nach vorne
2021-09-09 11:00:593854Durchsuche

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();
// 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();
// 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();
关于 static 关键词的常见用法也在上面 3 个示例中得到综合体现。

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

new self() 与 new static() 的区别?

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

因为 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();

我们把 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen