【问题标题】:How to make 'self' in parent class refer to extended class in PHP?如何使父类中的'self'引用PHP中的扩展类?
【发布时间】:2020-05-31 06:27:57
【问题描述】:

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

如何在init() 中获取self 以在从它们调用时引用扩展类?我知道 PHP 文档中的 late static bindings page,但我不清楚如何在上述上下文中应用它。谢谢!

【问题讨论】:

  • 因为 B 继承了 A 而你还没有在 B 类中实现函数 init,所以它正在寻找父类的实现。
  • 我曾考虑过,但不是很干。那么,最好的方法是通过重写 B 类中的整个 init() 函数来覆盖 A::init() 吗?
  • @HorusKol 我错了,你给出了很好的解决方案。

标签: php factory dry self late-static-binding


【解决方案1】:
public static function init() {
    $instance = new static();
    $instance->doStuff();
}

您可以在 3v4l 上看到这个工作,这是一个沙箱一些 PHP 的好地方。

为什么是static?你看PHP manual for late static bindings 是对的,很遗憾该页面没有明确提到静态关键字的这种特定用途(尽管有评论)。

在后期静态绑定的上下文中,您可以将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();

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

【讨论】:

  • 感谢您花时间向我解释这一点,@HorusKol!我感激你! :)
猜你喜欢
  • 1970-01-01
  • 2019-07-04
  • 1970-01-01
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 2014-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多