首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从特征中的重写魔术方法调用父魔术方法

从特征中的重写魔术方法调用父魔术方法
EN

Stack Overflow用户
提问于 2015-05-26 13:42:46
回答 2查看 4.5K关注 0票数 13

问题

我是开源的一个特点,其中包括神奇的方法__call()。在测试期间,当使用该特性的类的父类包含__call方法时,我遇到了一个挑战。

我试过的

代码语言:javascript
复制
trait SomeTrait {
    public function __call($method, array $parameters) {
        // ...
        return parent::__call($method, $parameters);
    }
}

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

我还在其他一些answers的基础上尝试了以下内容

代码语言:javascript
复制
return call_user_func_array([$this, '__call'], [$method, $parameters]);

这导致了分割错误: 11。我想是因为一个无限的调用循环。

问题

如何从特征的__call方法中调用父级的__call方法?

如果不能直接从特征内部调用,我如何调用父级的__call方法呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-26 15:06:59

请检查下面的代码:

代码语言:javascript
复制
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());

这将打印:

代码语言:javascript
复制
string(3) "bar"
string(3) "bar"
NULL
NULL

带有要检查的代码的沙箱:http://3v4l.org/R8hI3

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

票数 12
EN

Stack Overflow用户

发布于 2015-05-26 15:18:48

这里的问题是,如果在没有父类的类中使用此特性,则此调用将失败。在调用父函数之前,可以考虑检查类是否有父函数。看起来可能是这样:

代码语言:javascript
复制
trait SomeTrait {
    public function __call($method, array $parameters) {
        // ...
        if (count(class_parents($this)) {
            return parent::__call($method, $parameters);
        }
    }
}

我也要说,这可能不是最好的设计方法。我不认为应该呈现可移植的、可组合的功能集的特性应该在采用类的继承链中改变/覆盖功能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30460329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档