如何使父 class 中的 'self' 引用 PHP 中的扩展 class?
How to make 'self' in parent class refer to extended class in PHP?
我正在使用 Wordpress,需要实例化一个新的 class 类似于这个过度简化的示例(对于接收一些参数的 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'
如何让 init()
中的 self
在被调用时引用扩展的 classes?我知道 PHP 文档中的 late static bindings page,但我不清楚如何在上述上下文中应用它。谢谢!
public static function init() {
$instance = new static();
$instance->doStuff();
}
您可以在 3v4l 上看到它正在运行,这是沙盒一些 PHP 的好地方。
为什么static
?您查看 PHP manual for late static bindings 是对的,遗憾的是该页面没有明确提及 static 关键字的这种特定用法(尽管有评论提到)。
在后期静态绑定的上下文中,您可以将 self
替换为 static
,它将使用实例化的 class,而 self
将使用 class 代码存在。例如:
<?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();
这甚至适用于静态上下文(不幸的是,static 关键字用于两种不同的上下文:静态调用和后期静态绑定),如我上面的示例。
我正在使用 Wordpress,需要实例化一个新的 class 类似于这个过度简化的示例(对于接收一些参数的 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'
如何让 init()
中的 self
在被调用时引用扩展的 classes?我知道 PHP 文档中的 late static bindings page,但我不清楚如何在上述上下文中应用它。谢谢!
public static function init() {
$instance = new static();
$instance->doStuff();
}
您可以在 3v4l 上看到它正在运行,这是沙盒一些 PHP 的好地方。
为什么static
?您查看 PHP manual for late static bindings 是对的,遗憾的是该页面没有明确提及 static 关键字的这种特定用法(尽管有评论提到)。
在后期静态绑定的上下文中,您可以将 self
替换为 static
,它将使用实例化的 class,而 self
将使用 class 代码存在。例如:
<?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();
这甚至适用于静态上下文(不幸的是,static 关键字用于两种不同的上下文:静态调用和后期静态绑定),如我上面的示例。