gpt4 book ai didi

php - 为什么方法重命名在 PHP 特征中不起作用?

转载 作者:可可西里 更新时间:2023-11-01 12:39:42 27 4
gpt4 key购买 nike

我使用 PHP 7.1.0。

假设我们有一个特征,我们在类中使用它并重命名导入的方法:

trait T
{
public function A() {
echo ".";
}
}

class C
{
use T {
A as B;
}
}

$c = new C();
$c->B();
$c->A(); // Why does it work?

为什么 PHP 仍然允许我使用旧的方法名称(在本例中为 A)?

这真的很痛苦,因为在更复杂的示例中您不能依赖方法重命名 - 因此您可能会意外收到“不兼容的声明”错误:

class BaseSrc
{
}

trait BaseTrait
{
public function init(BaseSrc $baseSrc)
{
echo "Init Base";
}
}

class Base
{
use BaseTrait {
BaseTrait::init as initBase;
}
}

$base = new Base();
$base->initBase(new BaseSrc());
$base->init(new BaseSrc()); // WHY DOES IT WORK?????

class MainSrc extends BaseSrc
{
}

trait MainTrait
{
use BaseTrait {
BaseTrait::init as initBase;
}

public function init(MainSrc $mainSrc)
{
$this->initBase($mainSrc);
echo "Init Main";
}
}

// Warning: Declaration of MainTrait::init(MainSrc $mainSrc) should be compatible with Base::init(BaseSrc $baseSrc)
class Main extends Base
{
use MainTrait;
}

我认为,这段代码应该可以工作。因为我在 Base 类中将 init() 重命名为 initBase() 并且在使用 BaseTrait 时进行了相同的重命名在 MainTrait 中,我希望此方法 (BaseTrait::init()) 不会与 MainTrait::init() 冲突。事实上,PHP 说我有不兼容的声明。其背后的原因是将 init 重命名为 initBase 不起作用 - 方法 init 仍然存在,在我的 Base 类中!

有什么方法可以解决这个问题,而不是从一开始就将 BaseTrait::init() 重命名为类似 BaseTrait::initBase() 的东西(不仅仅是在 use 语句中)?

我应该将此视为 PHP 错误并报告吗?这种行为背后有什么合理的地方吗?

最佳答案

如评论中所述,为了完整性;来自PHP manual section on Traits :

The Aliased_Talker makes use of the as operator to be able to use B's bigTalk implementation under an additional alias talk.

然后:

The as operator can be used to add an alias to one of the methods. Note the as operator does not rename the method and it does not affect any other method either.

所以 as 添加了一个别名,但不会以任何方式替换或影响原始方法。这是预期的行为。

关于php - 为什么方法重命名在 PHP 特征中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43836171/

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