如何使父 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 关键字用于两种不同的上下文:静态调用和后期静态绑定),如我上面的示例。