如何使用与静态方法冲突的特征与继承的静态方法相冲突?

时间:2016-03-28 21:12:33

标签: php inheritance traits

假设我有一个特征和一个类,每个特征都有一个同名的方法,但是类的方法是静态的而特征的方法不是。是否可以定义一个既继承自该类又使用特征的类?

在代码中,这看起来像

trait MyTrait
{
    public function doStuff()
    {
        return 'trait';
    }
}

class ParentClass
{
    public static function doStuff()
    {
        return 'parent';
    }
}

class ChildClass extends ParentClass // I'm feeling really original today apparently
{
    use MyTrait;
}

我的第一个想法是对特征上的方法进行别名,比如

class ChildClass extends ParentClass
{
    use MyTrait {
        doStuff as doOtherStuff;
    }
}

但似乎特性仍在尝试从父类覆盖该方法,因此会抛出错误

Cannot make static method ParentClass::doStuff() non static in class MyTrait

我正在尝试做什么?如果是这样,怎么样?如果没有,请解释原因。谢谢!

修改
不幸的是,改变方法名称对我来说不是一个可行的选择,因为类和特性都被广泛地用于应用程序的其他部分。根据{{​​3}},特征的方法总是覆盖继承的方法。 (如果你将ParentClass::doStuff更改为非静态的,你可以看到这一点,但这不是我可以做到的事情。)或许我所问的是它是否真的&#39 ; s可能使特征的方法覆盖继承的静态方法(这似乎是正常的行为)?

我还创建了第二个特征,将MyTrait::doStuff别名化为doOtherStuff并改为使用它。

trait MyTrait2
{
    use MyTrait {
        doStuff as doOtherStuff;
    }
}

class ChildClass extends ParentClass
{
    use MyTrait2;
}

但这会产生同样的错误,我觉得很奇怪。

Cannot make static method ParentClass::doStuff() non static in class MyTrait2

1 个答案:

答案 0 :(得分:0)

这可能是一种误解。静态方法和非静态方法不应该做同样的工作,所以应该有不同的名称,也许你的名字不够明确。

您无法执行此操作,因为在创建别名时,旧名称和新名称都存在。所以作为" doStuff"仍然存在,它与ParentClass产生冲突。

见这个例子:

trait MyTrait
{
    public function doStuff()
    {
        return 'foo';
    }
}

class Foo
{
    use MyTrait {
        doStuff as doOtherStuff;
    }
}

echo Foo::doStuff(); // doStuff still works