gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 07:50:21 25 4
gpt4 key购买 nike

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

在代码中,这看起来像

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;
}
}

但似乎 trait 仍在尝试覆盖父类的方法,所以这会引发错误

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

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

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

我还创建了第二个特征,将 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

最佳答案

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

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

看这个例子:

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

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

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

关于php - 如何将特征与与继承的静态方法冲突的非静态方法一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36271281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com