Heim  >  Artikel  >  Backend-Entwicklung  >  Erhalten Sie in wenigen Minuten das Schlüsselwort self von PHP

Erhalten Sie in wenigen Minuten das Schlüsselwort self von PHP

silencement
silencementnach vorne
2020-01-22 00:47:551755Durchsuche

Erhalten Sie in wenigen Minuten das Schlüsselwort self von PHP

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 mit self statischen Mitgliedsfunktionen und nicht statischen Mitgliedsfunktionen aufgerufen werden.

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.

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

Andere Member-Funktionen können self dazu verwenden Rufen Sie statische Mitgliedsfunktionen und nicht statische Mitgliedsfunktionen auf.

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.

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

Der allgemeine Zweck von Statik besteht darin, Funktionen oder Variablen zu ändern, um sie zu Klassenfunktionen und Klassenvariablen zu machen. Außerdem können Variablen innerhalb von Funktionen geändert werden, um ihren Lebenszyklus zu verlängern der gesamten Bewerbung.

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:

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

In Bezug auf Funktionsreferenzen ist der Unterschied zwischen self und static: für statische Mitgliedsfunktionen self zeigt auf die aktuelle Klasse des Codes, statisch zeigt auf die aufrufende Klasse; bei nicht statischen Mitgliedsfunktionen unterdrückt selbst der Polymorphismus und zeigt auf die Mitgliedsfunktion der aktuellen Klasse, statisch ist äquivalent dazu und dynamisch zeigt auf die Funktion von die aufrufende 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. Um auf nicht-statische Mitgliedsvariablen zuzugreifen, kann self nicht verwendet werden, sondern nur this; 🎜> Dies sollte verwendet werden, wenn das Objekt instanziiert wurde, self hat diese Einschränkung nicht;

wird in nicht statischen Memberfunktionen verwendet, self unterdrückt polymorphes Verhalten und bezieht sich auf die Funktion der aktuellen Klasse; 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 überschrieben;

Slots

这几个关键字中,只有this要加$符号且必须加,强迫症表示很难受;

静态成员函数中不能通过$this->调用非静态成员函数,但是可以通过self::调用,且在调用函数中未使用$this->的情况下还能顺畅运行。此行为貌似在不同PHP版本中表现不同,在当前的7.3中ok;

在静态函数和非静态函数中输出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的self关键字的详细内容。

Das obige ist der detaillierte Inhalt vonErhalten Sie in wenigen Minuten das Schlüsselwort self von PHP. 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