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

Detaillierte Erklärung des Schlüsselworts self in PHP

coldplay.xixi
coldplay.xixinach vorne
2020-06-06 17:52:592992Durchsuche

Detaillierte Erklärung des Schlüsselworts self in PHP

Analyse des PHP-Schlüsselworts self

Jemand in der PHP-Gruppe fragte nach der Verwendung des Schlüsselworts self und Die Antwort liegt auf der Hand:

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

Andere Mitgliedsfunktionen können self verwenden, um statische Mitgliedsfunktionen und nicht statische Mitgliedsfunktionen 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.

Um das Selbst vollständig zu verstehen, müssen Sie es vom übergeordneten, statischen und diesem unterscheiden.

Das Folgende sind Vergleiche

parent

Die Unterscheidung zwischen Selbst und Eltern ist relativ einfach: Der Elternbezug auf die Elternklasse/-basis Die Klasse ist eine versteckte Methode (oder Variable), self bezieht sich auf ihre eigene Methode (oder Variable).

Zum Beispiel 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!

static

Der allgemeine Zweck von Static besteht darin, Funktionen oder Variablen zu ändern, um sie zu Klassenfunktionen zu machen und Klassenvariablen. Sie können Variablen innerhalb einer Funktion ändern, um ihren Lebenszyklus auf den Lebenszyklus der gesamten Anwendung auszudehnen.

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.

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:

Basiskonstruktor!
Untergeordneter Konstruktor!
Basis-Foo!
Child Foo!
Child Foo!

In Bezug auf Funktionsreferenzen ist der Unterschied zwischen self und static: Bei statischen Memberfunktionen verweist self auf die aktuelle Klasse des Codes. und statisch zeigt auf die aufrufende Klasse; für nicht statische Mitgliederfunktionen unterdrückt selbst Polymorphismus, zeigt auf die Mitgliedsfunktion der aktuellen Klasse, statisch ist äquivalent dazu und dynamisch zeigt 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.


Der Hauptunterschied zwischen den beiden ist wie folgt:

dies kann nicht in statischen Elementen verwendet werden Funktionen, self Ja;

Für den Zugriff auf statische Memberfunktionen/-variablen wird empfohlen, self anstelle von $this:: oder $this-> zu verwenden.

Für den Zugriff auf nicht- statische Mitgliedsvariablen „Self“ können nicht verwendet werden, nur diese

diese muss verwendet werden, wenn das Objekt instanziiert wurde, self hat keine solche Einschränkung

kann innerhalb nicht statischer Mitgliedsfunktionen verwendet werden , selbstunterdrückendes Polymorphismusverhalten bezieht sich auf die Funktion der aktuellen Klasse und diese bezieht sich auf die übergeordnete Funktion der aufrufenden Klasse (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 referenziert die statischen Mitgliedsvariablen und statischen Funktionen der aktuellen Klasse;

unterdrückt polymorphes Verhalten und Referenzen Funktionen der aktuellen Klasse und nicht in Unterklassen abgedeckte Implementierungen;


Slots

Unter diesen Schlüsselwörtern muss nur This hinzugefügt werden mit einem $-Zeichen und muss hinzugefügt werden, was sehr unangenehm ist.

Statische Mitgliedsfunktionen können nicht über $this-> aufgerufen werden, aber sie können über self aufgerufen werden: :, und beim Aufrufen der Funktion kann es auch ohne Verwendung von $this-> reibungslos laufen. Dieses Verhalten scheint sich in verschiedenen PHP-Versionen unterschiedlich zu verhalten, ist aber in der aktuellen Version 7.3 in Ordnung

在静态函数和非静态函数中输出self,猜猜结果是什么?都是string(4) "self",迷之输出;

return $this instanceof static::class;会有语法错误,但是以下两种写法就正常:
$class = static::class;
return $this instanceof $class;
// 或者这样:
return $this instanceof static;

所以这是为什么啊?!

$class = static::class;

return $this instanceof $class;

// 或者这样:

return $this instanceof static;

推荐教程:《PHP视频教程

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

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