PHP - 对象实例化上下文 - 奇怪的行为 - 这是PHP错误吗?

Ahm*_*ouk 6 php inheritance class object instantiation

我没有问一个典型的问题,为什么有些代码失败了,但我问的是为什么它有效.它在编码时与我合作,我需要它失败.

案件

  • 一个基本抽象类,其受保护的构造函数声明为abstract
  • 父类使用公共构造函数扩展抽象类(Over ridding)
  • 子类使用受保护的构造函数扩展相同的抽象类

      abstract class BaseClass {
        abstract protected function __construct();
      }
    
      class ChildClass extends BaseClass {
        protected function __construct(){
          echo 'It works';
         }
      }
    
      class ParentClass extends BaseClass {
        public function __construct() {
          new ChildClass();
        }
      }
    
      // $obj = new ChildClass(); // Will result in fatal error. Expected!
    
      $obj = new ParentClass(); // that works!!WHY?
    
    Run Code Online (Sandbox Code Playgroud)

父类实例化子类对象,它的工作原理!! 怎么会这样呢?据我所知,如果对象的构造函数声明为protected,则无法实例化对象,除了内部或通过继承从任何子类内部.

父类不是子类的子类,它不从它继承一角钱(但都扩展了相同的基本抽象类),那么如何实例化不会失败?

编辑

这种情况只发生在一个抽象的BaseClass上,它也有一个抽象的构造函数.如果BaseClass是concerete,或者如果它的受保护的构造函数不是抽象的,那么实例化会按预期失败..这是一个PHP错误吗? 为了我的理智,我需要解释为什么PHP在这种非常具体的情况下以这种方式运行.

提前致谢

qui*_*tin 1

我想知道幕后的抽象实现是否有问题,或者是否存在我们遗漏的微妙问题。将 BaseClass 从抽象更改为具体会产生您所追求的致命错误(为了我的理智而重命名的类)

编辑:我同意 @deceze 在他的评论中所说的,这是抽象实现的边缘情况,并且可能是一个错误。这至少是一种解决方法,它提供了预期的行为,尽管有一些丑陋的技术(假装的抽象基类)。

class BaseClass
{
    protected function __construct()
    {
        die('Psuedo Abstract function; override in sub-class!');
    }
}

class ChildClassComposed extends BaseClass
{
    protected function __construct()
    {
        echo 'It works';
    }
}


// Child of BaseClass, Composes ChildClassComposed
class ChildClassComposer extends BaseClass
{
    public function __construct()
    {
        new ChildClassComposed();
    }
}
Run Code Online (Sandbox Code Playgroud)

PHP 致命错误:从第 46 行 /Users/quickshiftin/junk-php/change-private-of-another-class.php 中的上下文“ChildClassComposer”调用受保护的 ChildClassComposited::__construct()