Späte statische Bindung

PHP unterstützt späte statische Bindung ("Late static binding"). Hiermit kann die aufgerufene Klasse im Kontext statischer Vererbung referenziert werden.

Genauer gesagt funktioniert späte statische Bindung durch das Speichern der Klasse, die im letzten "nicht weiterleitenden Aufruf" angegeben wurde. Im Fall von statischen Methodenaufrufen ist dies die explizit angegebene Klasse (üblicherweise diejenige auf der linken Seite des Operators ::); im Fall von nicht statischen Methodenaufrufen ist es die Klasse des Objekts. Ein "weiterleitender Aufruf" ist ein statischer, der durch self::, parent::, static:: oder, in der Klassenhierarchie nach oben gehend, durch forward_static_call() eingeleitet wurde. Die Funktion get_called_class() kann benutzt werden, um eine Zeichenkette mit dem Namen der aufgerufenen Klasse abzufragen, und static:: führt ihren Geltungsbereich ein.

Diese Funktionalität wurde in Hinblick auf die interne Perspektive als "späte statische Bindung" benannt. "Späte Bindung" bezieht sich auf die Tatsache, dass static:: nicht über die Klasse, in der die aufgerufene Methode definiert ist, aufgelöst wird, stattdessen wird diese mit Hilfe von Laufzeitinformationen bestimmt. Die Benennung als "statische Bindung" beruht darauf, dass dieser Mechanismus unter anderem für statische Methodenaufrufe genutzt werden kann.

Beschränkungen von self::

Statische Referenzen auf die aktuelle Klasse wie self:: oder __CLASS__ werden mit Hilfe der Klasse, zu der die Methode gehört, also in welcher sie definiert ist, aufgelöst.

Beispiel #1 Nutzung von self::

<?php
class {
    public static function 
who() {
        echo 
__CLASS__;
    }
    public static function 
test() {
        
self::who();
    }
}

class 
extends {
    public static function 
who() {
        echo 
__CLASS__;
    }
}

B::test();
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

A

Nutzung später statischer Bindung

Späte statische Bindung versucht diese Beschränkung zu umgehen, indem ein neues Schlüsselwort eingeführt wird, das die Klasse referenziert, die tatsächlich zur Laufzeit genutzt wurde. Im Grunde genommen also ein Schlüsselwort, das es im vorherigen Beispiel ermöglicht die Klasse B aus der aufgerufenen Methode test() zu referenzieren. Es wurde entschieden, kein neues Schlüsselwort einzuführen, sondern statt dessen static zu verwenden, das bereits als reserviertes Schlüsselwort existierte.

Beispiel #2 Einfache Nutzung von static::

<?php
class {
    public static function 
who() {
        echo 
__CLASS__;
    }
    public static function 
test() {
        static::
who(); // Hier kommt die späte statische Bindung
    
}
}

class 
extends {
    public static function 
who() {
        echo 
__CLASS__;
    }
}

B::test();
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

B

Hinweis:

In nicht statischen Kontexten ist die aufgerufene Klasse die Klasse des Objekt-Exemplars. Da $this-> versucht private Methoden im gleichen Geltungsbereich aufzurufen, kann die Verwendung von static:: andere Ergebnisse liefern. Ein weiterer Unterschied ist, dass static:: sich nur auf statische Eigenschaften beziehen kann.

Beispiel #3 Nutzung von static:: außerhalb eines statischen Kontexts

<?php
class {
    private function 
foo() {
        echo 
"Erfolg!\n";
    }
    public function 
test() {
        
$this->foo();
        static::
foo();
    }
}

class 
extends {
   
/* foo() wird nach B kopiert, weshalb ihr Geltungsbereich immer noch A ist,
    * und der Aufruf wird erfolgreich sein */
}

class 
extends {
    private function 
foo() {
        
/* ursprüngliche Methode wird ersetzt; der Geltungsbereich der neuen ist C */
    
}
}

$b = new B();
$b->test();
$c = new C();
$c->test();   //scheitert
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

Erfolg!
Erfolg!
Erfolg!


Fatal error:  Call to private method C::foo() from context 'A' in /tmp/test.php on line 9

Hinweis:

Die Auflösung später statischer Bindungen endet mit einem vollständig aufgelösten statischen Aufruf ohne Alternative. Statische Aufrufe, die Schlüsselworte wie parent:: oder self:: nutzen, geben dagegen die Aufrufinformationen weiter.

Beispiel #4 Weitergegebene und nicht weitergegebene Aufrufe

<?php
class {
    public static function 
foo() {
        static::
who();
    }

    public static function 
who() {
        echo 
__CLASS__."\n";
    }
}

class 
extends {
    public static function 
test() {
        
A::foo();
        
parent::foo();
        
self::foo();
    }

    public static function 
who() {
        echo 
__CLASS__."\n";
    }
}
class 
extends {
    public static function 
who() {
        echo 
__CLASS__."\n";
    }
}

C::test();
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

A
C
C

Hier Kannst Du einen Kommentar verfassen


Bitte gib mindestens 10 Zeichen ein.
Wird geladen... Bitte warte.
* Pflichtangabe
Es sind noch keine Kommentare vorhanden.

Technisches SEO bleibt relevant

Technisches SEO – Was ist das überhaupt? Technisches SEO bezieht sich auf die Optimierung der technischen Aspekte deiner Webseite. Das Ziel ist klar! ...

admin

Autor : admin
Kategorie: SEO & Online-Marketing

Was ist neu in der PHP 8.2.10

PHP 8.2.10 ist eine der neuesten Versionen von PHP, die eine Reihe von Verbesserungen und neuen Funktionen mit sich bringt. In diesem Artikel werden wir einige der herausragenden Neuerungen und Verbesserungen dieser Version diskutieren. ...

admin

Autor : admin
Kategorie: Software-Updates

Total Commander 11.00 (final) ist verfügbar!

Total Commander, ein beliebter Datei-Manager, hat kürzlich seine neueste Version, 11.00, veröffentlicht. Mit einer Vielzahl von neuen Funktionen und Korrekturen bietet diese Version den Benutzern ein verbessertes und optimiertes Erlebnis. ...

admin

Autor : admin
Kategorie: Software-Updates

Tutorial veröffentlichen

Tutorial veröffentlichen

Teile Dein Wissen mit anderen Entwicklern weltweit

Du bist Profi in deinem Bereich und möchtest dein Wissen teilen, dann melde dich jetzt an und teile es mit unserer PHP-Community

mehr erfahren

Tutorial veröffentlichen

Warning: Undefined variabl

völlig übersehen, ja der code müssste mal überrbeitet werden. mit http_client ... ect. gut zu wissen. hat sich ja doch mehr verändert als ged ...

Geschrieben von derneue1 am 20.02.2024 00:00:45
Forum: PHP Developer Forum
Warning: Undefined variabl

Ähm, die weißt schon, dass wir hier von Grundlagen reden, oder? if ($new)​ if (isset($new))​ $ers["username"] = "" . $ers["username"] . ...

Geschrieben von scatello am 19.02.2024 21:00:38
Forum: PHP Developer Forum
Warning: Undefined variabl

ok, das geht. eigentlich war das reporting vorher auch immer an, komisch. und wie sieht das hier aus ? Warning: Undefined variable $new in /var/ww ...

Geschrieben von derneue1 am 19.02.2024 18:55:03
Forum: PHP Developer Forum
Warning: Undefined variabl

ich bunutze schon lange ein script was immer funktioniert hat. Das lag aber nur daran, dass du das Error-Reporting nicht hochgedreht hast, denn da ...

Geschrieben von scatello am 19.02.2024 17:59:56
Forum: PHP Developer Forum