Heim> PHP-Framework> Laravel> Hauptteil

Was ist die Verwendung von self in Laravel?

WBOY
Freigeben: 2022-02-18 11:50:37
Original
2621 Leute haben es durchsucht

In Laravel wird das Schlüsselwort self verwendet, um den Klassennamen zu ersetzen. Es kann auf die statischen Mitgliedsvariablen und statischen Funktionen der aktuellen Klasse verweisen class anstelle der überschriebenen Implementierung in der Unterklasse self verweist immer auf die aktuelle Klasse und Klasseninstanz.

Was ist die Verwendung von self in Laravel?

Die Betriebsumgebung dieses Artikels: Windows 10-System, Laravel Version 6, Dell G3-Computer.

Was ist die Verwendung von self in Laravel?

Sie könnenthisnicht verwenden, um Nicht-Member-Funktionen innerhalb einer statischen Member-Funktion aufzurufen, aber Sie könnenselfverwenden, um statische Funktionen aufzurufen Mitgliedsfunktionen/Variablen/Konstanten; Andere Mitgliedsfunktionen könnenselfverwenden, um statische Mitgliedsfunktionen und nicht statische Mitgliedsfunktionen aufzurufen. Als sich die Diskussion vertiefte, stellte ich fest, dassselfnicht so einfach ist. Vor diesem Hintergrund vergleicht und differenziert dieser Artikel zunächst mehrere Schlüsselwörter und fasst dann die Verwendung vonselfzusammen.this调用非成员函数,但可以用self调用静态成员函数/变量/常量;其他成员函数可以用self调用静态成员函数以及非静态成员函数。随着讨论的深入,发现self并没有那么简单。鉴于此,本文先对几个关键字做对比和区分,再总结self的用法。

parentstatic以及this的区别

要想将彻底搞懂self,要与parentstatic以及this区分开。以下分别做对比。

parent

selfparent的区分比较容易:parent引用父类/基类被隐盖的方法(或变量),self则引用自身方法(或变量)。例如构造函数中调用父类构造函数:

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!
Nach dem Login kopieren

static

static常规用途是修饰函数或变量使其成为类函数和类变量,也可以修饰函数内变量延长其生命周期至整个应用程序的生命周期。但是其与self关联上是PHP 5.3以来引入的新用途:静态延迟绑定。

有了static的静态延迟绑定功能,可以在运行时动态确定归属的类。例如:

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

程序输出结果如下:

Base constructor! Child constructor! Base Foo! Child Foo! Child Foo!
Nach dem Login kopieren

在函数引用上,selfstatic的区别是:对于静态成员函数,self指向代码当前类,static指向调用类;对于非静态成员函数,self抑制多态,指向当前类的成员函数,static等同于this,动态指向调用类的函数。

parentselfstatic三个关键字联合在一起看挺有意思,分别指向父类、当前类、子类,有点“过去、现在、未来”的味道。

this

selfthis是被讨论最多,也是最容易引起误用的组合。两者的主要区别如下:

  1. this不能用在静态成员函数中,self可以;
  2. 对静态成员函数/变量的访问, 建议 用self,不要用$this::$this->的形式;
  3. 对非静态成员变量的访问,不能用self,只能用this;
  4. this要在对象已经实例化的情况下使用,self没有此限制;
  5. 在非静态成员函数内使用,self抑制多态行为,引用当前类的函数;而this引用调用类的重写(override)函数(如果有的话)。

self的用途

看完与上述三个关键字的区别,self的用途是不是呼之即出?一句话总结,那就是:self

Der Unterschied zwischen parent, staticund thisUm selfvollständig zu verstehen, müssen Sie mit parent , staticund thiswerden unterschieden. Nachfolgend werden Vergleiche angestellt.

parent

selfund parentsind leichter zu unterscheiden: parentbezieht sich auf die übergeordnete Klasse /Die Methode (oder Variable) der Basisklasse ist ausgeblendet und selfverweist auf seine eigene Methode (oder Variable). Rufen Sie beispielsweise den Konstruktor der übergeordneten Klasse im Konstruktor auf: rrreee

static

staticDer allgemeine Zweck besteht darin, die zu erstellende Funktion oder Variable zu ändern Es handelt sich um eine Klassenfunktion und Klassenvariablen, die auch geändert werden können, um den Lebenszyklus von Variablen innerhalb einer Funktion auf den Lebenszyklus der gesamten Anwendung auszudehnen. Aber seine Verknüpfung mit selfist eine neue Verwendung, die seit PHP 5.3 eingeführt wurde: statische verzögerte Bindung. Mit der statischen verzögerten Bindungsfunktion von statickann die zugehörige Klasse zur Laufzeit dynamisch ermittelt werden. Zum Beispiel: rrreeeDie Programmausgabe lautet wie folgt: rrreeeIn Bezug auf Funktionsreferenzen ist der Unterschied zwischen selfund static: für statische Memberfunktionen self code> zeigt auf die aktuelle Klasse des Codes, staticzeigt auf die aufrufende Klasse für nicht statische Memberfunktionen, selfunterdrückt Polymorphismus und zeigt auf Die Mitgliedsfunktion der aktuellen Klasse, static code>, entspricht thisund zeigt dynamisch auf die Funktion der aufrufenden Klasse. parent, selfund staticsind zusammen sehr interessant zu betrachten. Sie verweisen jeweils auf die übergeordnete Klasse, die aktuelle Klasse und die Unterklasse . Es hat ein bisschen ein Gefühl von „Vergangenheit, Gegenwart, Zukunft“.

this

selfund thissind die am meisten diskutierten und am wahrscheinlichsten missbrauchten Kombinationen. Der Hauptunterschied zwischen den beiden ist wie folgt:
  1. thiskann nicht in statischen Memberfunktionen verwendet werden,selfkann
  2. für statische Member Für den Funktions-/Variablenzugriff wird empfohlen,selfanstelle von$this::oder$this->;
  3. Um auf nicht statische Mitgliedsvariablen zuzugreifen, kannselfnicht verwendet werden, sondern nurthis;
  4. thisist erforderlich. Bei Verwendung, wenn das Objekt instanziiert wurde, unterliegtselfdieser Einschränkung nicht.
  5. Bei Verwendung innerhalb einer nicht statischen Member-Funktion gilt:selfunterdrückt polymorphes Verhalten undthisbezieht sich auf die übergeordnete Funktion der aufrufenden Klasse (falls vorhanden).
Der Zweck von selfIst der Zweck von selfnach dem Lesen der Unterschiede zu den oben genannten drei Schlüsselwörtern sofort offensichtlich? Um es in einem Satz zusammenzufassen: selfzeigt immer auf „die aktuelle Klasse (und Klasseninstanz)“. Die Details sind:
  1. Ersetzen Sie den Klassennamen, beziehen Sie sich auf die statischen Mitgliedsvariablen und statischen Funktionen der aktuellen Klasse.
  2. Unterdrücken Sie das polymorphe Verhalten. Verweisen Sie auf die Funktionen der aktuellen Klasse anstelle der in der Unterklasse abgedeckten Implementierung
  3. Dies sind die wichtigsten Punkte. Unter den Zeichen muss nur diesmit dem Symbol $hinzugefügt werden, was bedeutet, dass es sehr unangenehm ist

Sie können$this-> ruft eine nicht-statische Member-Funktion auf, aber sie kann überself::aufgerufen werden und sogar reibungslos laufen wenn$this->nicht in der aufrufenden Funktion verwendet wird. Dieses Verhalten scheint sich in verschiedenen PHP-Versionen unterschiedlich zu verhalten.

    selfwird in statischen Funktionen und nicht statischen Funktionen ausgegeben. Beide sind string(4) "self"und verwirren die Ausgabe; Schreiben sind normal:
  1. $class = static::class;this要加$符号且必须加,强迫症表示很难受;
  2. 静态成员函数中不能通过$this->调用非静态成员函数,但是可以通过self::调用,且在调用函数中未使用$this->的情况下还能顺畅运行。此行为貌似在不同PHP版本中表现不同,在当前的7.3中ok;
  3. 在静态函数和非静态函数中输出self,猜猜结果是什么?都是string(4) "self",迷之输出;
  4. return $this instanceof static::class;return $this instanceof $class;
    // Oder so:
    return $this instanceof static;

  5. 【Verwandte Empfehlung:
Laravel-Video-Tutorial

Das obige ist der detaillierte Inhalt vonWas ist die Verwendung von self in Laravel?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
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
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!