0

我正在使用 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'

self从扩展类调用时,我如何才能init()引用扩展类?我知道 PHP 文档中的后期静态绑定页面,但我不清楚如何在上述上下文中应用它。谢谢!

4

1 回答 1

4
public static function init() {
    $instance = new static();
    $instance->doStuff();
}

你可以看到这在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();

根据我上面的示例,这甚至可以在静态上下文中使用(不幸的是,静态关键字用于两种不同的上下文:静态调用和后期静态绑定)。

于 2020-02-15T22:43:26.753 回答