In diesem Artikel wird hauptsächlich die Verwendung des Scope-Auflösungsoperators (::) vorgestellt, der einen gewissen Referenzwert hat. Jetzt können Freunde in Not darauf verweisen.
Sehen Sie sich heute Joomla an Ich merke es erst, wenn ich den Quellcode gelesen habe. Es stellt sich heraus, dass dieser Operator auch auf nicht statische Methoden der Klasse zugreifen kann. Es überrascht mich wirklich nicht. Ich habe immer gedacht, dass der Bereichsauflösungsoperator nur auf statische Methoden und statische Mitgliedsvariablen einer Klasse zugreifen kann.
Scope Resolution Operator (::)
Das wurde mir heute klar, als ich mir den Joomla-Quellcode ansah. Es stellt sich heraus, dass dieser Operator auch auf nicht statische Methoden der Klasse zugreifen kann. Es überrascht mich wirklich nicht. Ich habe immer gedacht, dass der Bereichsauflösungsoperator nur auf statische Methoden und statische Mitgliedsvariablen einer Klasse zugreifen kann.
Wenn Sie es nicht glauben, finden Sie hier einen einfachen kleinen Testcode, der dies beweisen kann.
class A{ private $_name = 'A'; function __construct(){ echo 'A construct <br />'; } function test(){ echo 'A test() <br />'; } } class B extends A{ private $_name = 'B'; function __construct(){ parent::__construct(); echo 'B construct <br />'; } function test(){ echo 'B test()'; } } A::test(); echo '######### <br />'; B::test();
Das Ergebnis der Eingabe dieses Codes ist:
A test() ######### B test()
Obwohl test() in Klasse A und test in Klasse B keine statischen Methoden sind, können Sie dennoch „Klassenname:: Methodenname“ verwenden (Parameterliste)“-Stil, um einen korrekten Aufruf durchzuführen. Der Effekt ist derselbe, als würde man eine Instanz einer Klasse neu erstellen und dann diese Instanz verwenden, um die
Testmethode aufzurufen.
Wenn ich jedoch das Namensattribut in der Testmethode drucken muss, was passiert, wenn ich es direkt mit :: aufrufe? Ändern wir zunächst den obigen Code.
class A{ private $_name = 'A'; function __construct(){ echo 'A construct <br />'; } function test(){ echo 'A test() <br />', $this->$_name,'<br />'; } } class B extends A{ private $_name = 'B'; function __construct(){ parent::__construct(); echo 'B construct <br />'; } function test(){ echo 'B test()', $this->_name,'<br />'; } } A::test(); echo '######### <br />'; B::test();
Das Ergebnis der Ausführung des obigen Codes ist wie folgt:
Fatal error: Using $this when not in object context in D:\www\test\scoperefe.php on line 9 [html]
Das haben einige Freunde gesagt. Sie haben Klasse A überhaupt nicht instanziiert. Natürlich können Sie mit $this->_name nicht direkt auf die Mitgliedsvariable $_name zugreifen. Können Sie sie also einfach in self::$_name ändern?
Machen Sie es einfach und ändern Sie den obigen Code unten
[code] class A{ private $_name = 'A'; function __construct(){ echo 'A construct <br />'; } function test(){ echo 'A test() <br />', self::$_name,'<br />'; } } class B extends A{ private $_name = 'B'; function __construct(){ parent::__construct(); echo 'B construct <br />'; } function test(){ echo 'B test()', $this->_name,'<br />'; } } A::test(); echo '######### <br />'; B::test();
Führen Sie den obigen Code erneut aus. Das Ergebnis ist wie folgt:
A test() Fatal error: Access to undeclared static property: A::$_name in D:\www\test\scoperefe.php on line 9
Oh, es stellt sich heraus, dass Sie keinen Zugriff haben es mit dem Schlüsselwort self Eine nicht statische Methode der aktuellen Klasse.
Wenn Sie diese Methode nun korrekt aufrufen möchten, gibt es zwei Möglichkeiten:
1 Instanziieren Sie zuerst die Klasse und rufen Sie sie dann direkt mit $this->_name auf , setze die Mitgliedsvariable $_name auf static;
Ich glaube, dass jeder das oben genannte Problem richtig lösen kann.
Eigentlich möchte ich Folgendes sagen:
Wenn eine Methode ohne Instanziierung aufgerufen werden kann, ändern wir diese Methode besser mit dem Schlüsselwort static. Bei der Implementierung einer Methode werden nur die statischen Mitgliedsvariablen der Klasse aufgerufen. Auf diese Weise treten die oben aufgetretenen Probleme nicht auf.
Wenn eine Methode nicht auf eine statische Methode eingestellt ist. Dann ist es am sichersten, das Instanzobjekt zum Aufrufen zu verwenden. Dies ist sicherer, da die Implementierung der Methode möglicherweise irgendwann geändert werden muss aufzurufende Variablen (da wir beim Ändern der Implementierung der Methode größtenteils vergessen haben, sie direkt mit dem Klassennamen aufzurufen).
Meine bescheidene Meinung.
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er für das Studium aller hilfreich ist. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.
Verwandte Empfehlungen:
Über Eigenschaftsinjektion und Methodeninjektion des Komponentenverhaltens des Yii-Frameworks in PHP Über PHP seitdem Nutzungsanalyse zur Definition der Serialisierungsschnittstelle SerialisierbarDas obige ist der detaillierte Inhalt vonVerwenden Sie den PHP-Operator zur Bereichsauflösung (::).. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!