如何使父类中的“self”引用PHP中的扩展类?

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 文档中的最新静态绑定页面,但我不清楚如何在上述上下文中应用它。谢谢!

Hor*_*Kol 7

public static function init() {
    $instance = new static();
    $instance->doStuff();
}
Run Code Online (Sandbox Code Playgroud)

您可以看到它在3v4l上运行,这是对 PHP 进行沙箱处理的好地方。

为什么static?您正确地查看了PHP 手册中的后期静态绑定,但遗憾的是该页面没有明确提及 static 关键字的这种特定用法(尽管有一个注释确实提到了)。

在后期静态绑定的上下文中,您可以替换selfstatic,它将使用实例化的类,而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 关键字在两个不同的上下文中使用:静态调用和后期静态绑定),如我上面的示例所示。