在特征中调用覆盖魔法的父魔法

Jas*_*ary 13 php traits

问题

我正在寻找一种包含魔法的特质__call().在测试期间,当使用特征的类的父类包含该__call方法时,我遇到了一个挑战.

我试过的

trait SomeTrait {
    public function __call($method, array $parameters) {
        // ...
        return parent::__call($method, $parameters);
    }
}
Run Code Online (Sandbox Code Playgroud)

这会导致致命错误:当前类范围没有父级时,无法访问parent ::

我还根据其他一些答案尝试了以下内容:

return call_user_func_array([$this, '__call'], [$method, $parameters]);
Run Code Online (Sandbox Code Playgroud)

这会导致分段错误:11.我想是因为一个无限的调用循环.

如何__call__call特征方法中调用父方法?

如果直接在特征内无法实现,那么我怎么能调用父__call方法呢?

Ari*_*ius 10

请检查以下代码:

trait SomeTrait
{
    public function __call($method, array $parameters)
    {
        // ...
        return is_callable(['parent', '__call']) ? parent::__call($method, $parameters) : null;
    }
}

class GreatParentClass
{
    public function __call($method, array $parameters)
    {
        return 'bar';
    }
}

class ParenClassWithoutCall
{

}

class ProxyClass extends GreatParentClass
{

}

class FooClass extends ProxyClass
{
    use SomeTrait;
}

class BarClass extends GreatParentClass
{
    use SomeTrait;
}

class BazClass extends ParenClassWithoutCall
{
    use SomeTrait;
}

class SomeClassWithoutParent
{
    use SomeTrait;
}

$class = new FooClass();
var_dump($class->foobar());

$class = new BarClass();
var_dump($class->foobar());

$class = new BazClass();
var_dump($class->foobar());

$class = new SomeClassWithoutParent();
var_dump($class->foobar());
Run Code Online (Sandbox Code Playgroud)

这将打印:

string(3) "bar"
string(3) "bar"
NULL
NULL
Run Code Online (Sandbox Code Playgroud)

沙盒用代码检查:http: //3v4l.org/R8hI3

编辑:我认为这将涵盖所有可能性.