Ahm*_*ouk 6 php inheritance class object instantiation
我没有问一个典型的问题,为什么有些代码失败了,但我问的是为什么它有效.它在编码时与我合作,我需要它失败.
案件
子类使用受保护的构造函数扩展相同的抽象类
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在这种非常具体的情况下以这种方式运行.
提前致谢
我想知道幕后的抽象实现是否有问题,或者是否存在我们遗漏的微妙问题。将 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()
| 归档时间: |
|
| 查看次数: |
520 次 |
| 最近记录: |