rid*_*gek 3 php factory dry self late-static-binding
我正在使用 Wordpress,需要实例化一个类似于这个过于简化的示例的新类(对于add_action()接收一些参数的钩子):
class A {
public function __construct() {
}
public static function init() {
$instance = new self();
$instance->doStuff();
}
protected function doStuff() {
echo get_class($this);
}
}
class B extends A {
}
B::init(); //returns 'A'
Run Code Online (Sandbox Code Playgroud)
当扩展类调用时,我如何才能self引用init()它们?我知道PHP 文档中的最新静态绑定页面,但我不清楚如何在上述上下文中应用它。谢谢!
public static function init() {
$instance = new static();
$instance->doStuff();
}
Run Code Online (Sandbox Code Playgroud)
您可以看到它在3v4l上运行,这是对 PHP 进行沙箱处理的好地方。
为什么static?您正确地查看了PHP 手册中的后期静态绑定,但遗憾的是该页面没有明确提及 static 关键字的这种特定用法(尽管有一个注释确实提到了)。
在后期静态绑定的上下文中,您可以替换self为static,它将使用实例化的类,而self将使用代码所在的类。例如:
<?php
class A {
}
class B extends A {
public function test() {
echo parent::class;
echo self::class;
echo static::class;
}
}
class C extends B {
}
$c = new C();
$c->test();
Run Code Online (Sandbox Code Playgroud)
这甚至可以在静态上下文中工作(不幸的是,static 关键字在两个不同的上下文中使用:静态调用和后期静态绑定),如我上面的示例所示。