Heim >Backend-Entwicklung >PHP-Tutorial >Detaillierte Erklärung des PHP-Schlüsselworts self

Detaillierte Erklärung des PHP-Schlüsselworts self

angryTom
angryTomnach vorne
2020-01-03 16:04:593575Durchsuche

Detaillierte Erklärung des PHP-Schlüsselworts self

Jemand in der PHP-Gruppe hat nach der Verwendung des Schlüsselworts self gefragt, und die Antwort ist relativ offensichtlich:

Sie können dies nicht verwenden, um Nicht-Member-Funktionen aufzurufen eine statische Member-Funktion, aber Sie können self verwenden, um statische Member-Funktionen/Variablen/Konstanten aufzurufen.

Andere Member-Funktionen können self verwenden, um statische Member-Funktionen und nicht statische Member-Funktionen aufzurufen.

Als sich die Diskussion vertiefte, entdeckte ich, dass das Selbst nicht so einfach ist. Vor diesem Hintergrund vergleicht und differenziert dieser Artikel zunächst mehrere Schlüsselwörter und fasst dann die Verwendung von self zusammen.

Unterschiede von Parent, Statisch und Dies

Wenn Sie das Selbst vollständig verstehen wollen, müssen Sie es von Parent, Statisch und Dies unterscheiden.

Das Folgende sind Vergleiche

parent

Die Unterscheidung zwischen self und parent ist relativ einfach: parent bezieht sich auf die versteckte Methode der übergeordneten Klasse/ Als Basisklasse (oder Variable) verweist self auf seine eigene Methode (oder Variable).

Zum Beispiel wird der Aufruf des übergeordneten Klassenkonstruktors im Konstruktor:

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!

statisch

statisch im Allgemeinen verwendet, um Funktionen oder Variablen zu ändern, um sie zu Klassenfunktionen und Klassenvariablen zu machen. Es kann auch geändert werden, dass Variablen innerhalb einer Funktion ihren Lebenszyklus auf den Lebenszyklus der gesamten Anwendung verlängern.

Aber seine Assoziation mit sich selbst ist eine neue Verwendung, die seit PHP 5.3 eingeführt wurde: statische verzögerte Bindung.

Mit der statischen Verzögerungsbindungsfunktion von static kann die zugehörige Klasse zur Laufzeit dynamisch bestimmt werden. Empfohlen: „PHP Tutorial

Zum Beispiel:

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

Die Programmausgabe lautet wie folgt:

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

In Funktionsreferenzen self und static Der Unterschied besteht darin: Bei statischen Mitgliedsfunktionen zeigt self auf die aktuelle Klasse des Codes, und bei nicht statischen Mitgliedsfunktionen unterdrückt self den Polymorphismus und zeigt auf die Mitgliedsfunktion der aktuellen Klasse. static entspricht diesem und Dynamic verweist auf die Funktion der aufrufenden Klasse.

Es ist interessant, die drei Schlüsselwörter parent, self und static zusammen zu sehen. Sie verweisen jeweils auf die übergeordnete Klasse, die aktuelle Klasse und die Unterklasse, die eine Art „Vergangenheit, Gegenwart und Zukunft“ haben „Geschmack.

dieses

selbst und dies sind die am meisten diskutierten Kombinationen und werden auch am häufigsten missbraucht.

Die Hauptunterschiede zwischen den beiden sind wie folgt:

dies kann nicht in statischen Memberfunktionen verwendet werden, self kann

für statische Memberfunktionen /variables Für den Zugriff wird empfohlen, self anstelle von $this:: oder $this-> zu verwenden. Für den Zugriff auf nicht-statische Mitgliedsvariablen kann self nicht verwendet werden, sondern nur this;

Dies sollte verwendet werden, wenn das Objekt instanziiert wurde. Selbst unterliegt dieser Einschränkung nicht.

Wird in nicht statischen Mitgliedsfunktionen verwendet. Selbst unterdrückt polymorphes Verhalten und bezieht sich auf die Funktion der aktuellen Klasse. und dies bezieht sich auf die schwere Funktion der aufrufenden Klasse. Überschreiben Sie die Funktion (falls vorhanden).

Der Zweck des Selbst

Nachdem man die Unterschiede zu den oben genannten drei Schlüsselwörtern gelesen hat, ist der Zweck des Selbst sofort offensichtlich? Um es in einem Satz zusammenzufassen:

self zeigt immer auf „die aktuelle Klasse (und Klasseninstanz)

“.

Im Detail:

ersetzt den Klassennamen und verweist auf die statischen Mitgliedsvariablen und statischen Funktionen der aktuellen Klasse.

unterdrückt polymorphes Verhalten und verweist auf die Funktionen der aktuelle Klasse statt Implementierung in Unterklassen;

Slots

Unter diesen Schlüsselwörtern muss nur dies mit dem $-Zeichen hinzugefügt werden, was bedeutet, dass es sehr unangenehm ist ;

Nicht statische Memberfunktionen können nicht über $this-> aufgerufen werden, sie können jedoch über self:: aufgerufen werden, und sie können trotzdem reibungslos ausgeführt werden, ohne $this-> die aufrufende Funktion. Dieses Verhalten scheint sich in verschiedenen PHP-Versionen unterschiedlich zu verhalten. Es ist in der aktuellen Version 7.3 in Ordnung. Erraten Sie, was das Ergebnis ist. Sie sind alle string(4) „self“, was eine verwirrende Ausgabe ist;

return $this instanceof static::class; es wird Syntaxfehler geben, aber die folgenden zwei Schreibweisen sind normal:

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

Warum ist das so? !

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

Weitere PHP-bezogene Kenntnisse finden Sie auf der

PHP-Chinese-Website

!

Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung des PHP-Schlüsselworts self. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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