Heim > Artikel > Backend-Entwicklung > Sprechen Sie kurz über die verzögerte statische Bindung von PHP
Verwendungsszenarien
Beobachten Sie zunächst den folgenden Code:
abstract class base { //do sth } class aClass extends base{ public static function create(){ return new aClass(); } } class bClass extends base{ public static function create(){ return new bClass(); } } var_dump(aClass::create()); var_dump(bClass::create());
Ausgabe:
object(aClass)#1 (0) { } object(bClass)#1 (0) { }
Die oben genannten aClass und bClass erben von der abstrakten Klassenbasis, aber in Die statische Methode create() ist in beiden Unterklassen implementiert. Gemäß der Oop-Idee sollte diese Art von wiederholtem Code in der Basis der übergeordneten Klasse implementiert werden.
Verbesserter Code
abstract class base { public static function create(){ return new self(); } } class aClass extends base{ } class bClass extends base{ } var_dump(aClass::create()); var_dump(bClass::create());
Der aktuelle Code scheint mit unseren vorherigen Ideen übereinzustimmen. Lassen Sie uns ihn ausführen und sehen, was passiert .
Abstrakte Klassenbasis kann nicht instanziiert werden in ...
Leider scheint der Code nicht wie erwartet zu laufen, self() in der übergeordneten Klasse wird als Basis dieser übergeordneten Klasse analysiert Die Klasse erbt nicht von ihren Unterklassen. Um dieses Problem zu lösen, wurde in PHP5.3 das Konzept der verzögerten statischen Bindung eingeführt.
Verzögerte statische Bindung
abstract class base { public static function create(){ return new static(); } } class aClass extends base{ } class bClass extends base{ } var_dump(aClass::create()); var_dump(bClass::create());
Dieser Code ist fast derselbe wie der vorherige. Der Unterschied besteht darin, dass self durch das Schlüsselwort static ersetzt wird, anstatt als Unterklasse eine übergeordnete Klasse, damit die oben aufgetretenen Probleme gelöst werden können. Dies ist die verzögerte statische Bindung von PHP.
Führen Sie abschließend den Code aus und erhalten Sie das gewünschte Endergebnis.
object(aClass)#1 (0) { } object(bClass)#1 (0) { }
Weitere Artikel, die sich einfach mit PHP-verzögerter statischer Bindung befassen, finden Sie auf der chinesischen PHP-Website!