方法可见性+继承+闭包

时间:2018-02-10 22:33:24

标签: php php-5.6

行为是否低于php-5.6.x上的错误,或者这是预期的结果? 子类正在调用父类,父类通过闭包尝试实例化具有受保护构造函数的其他子类。

<?php 

class Child extends Base
{
    static function f()
    {
        parent::f(); // fails on php-5.6.x, doesn't fail on php-7.x

        // Base:f(); // doesn't fail on php-5.6.x
    }
}

class Base
{
    static function f()
    {
        Tr::inTr(
            function()
            {
                new Sibling();
            }
        );
    }
}

class Sibling extends Base
{
    protected function __construct()
    {
        echo 'I am protected';
    }
}

class Tr
{
    static function inTr($cb)
    {
        $cb();
    }
}

Child::f();

v5.6.x上的输出:

Fatal error: Call to protected AnotherChild::__construct() from context 'Child'

但它在php-7.x上并没有失败,因为它可以调用受保护的构造函数。

0 个答案:

没有答案