繁体   English   中英

如何将特征与与继承的静态方法冲突的非静态方法一起使用?

[英]How do you use a trait with a non-static method that conflicts with an inherited static method?

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

在代码中,这看起来像

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

我想做的事可能吗? 如果是这样,怎么办? 如果没有,请解释为什么不这样做。 谢谢!

编辑
不幸的是,更改方法名称对我来说不是一个可行的选择,因为类和特征都在应用程序的其他部分广泛使用。 根据PHP文档 ,特征的方法始终会覆盖继承的方法。 (如果您将ParentClass::doStuff更改为非静态,则可以在工作中看到这一点,但这也不是我可以做的。)也许我要问的是,是否真的有可能使trait的方法覆盖继承静态方法(这似乎是正常行为)?

我还创建别名第二个特征MyTrait::doStuffdoOtherStuff和使用代替。

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

class ChildClass extends ParentClass
{
    use MyTrait2;
}

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

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

这可能是一个误解。 静态方法和非静态方法不应执行相同的工作,因此应使用不同的名称,也许您的名称不够明确。

您不能这样做,因为在创建别名时,旧名称和新名称都存在。 因此,由于“ doStuff”仍然存在,因此与ParentClass产生了冲突。

请参阅以下示例:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM