为什么方法重命名在PHP特征中不起作用?
| 
 我使用 
 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()并在MainTrait中使用BaseTrait时进行相同的重命名,我希望此方法(BaseTrait :: init())不会与MainTrait :: init()冲突.事实上,PHP说我有不兼容的声明.其背后的原因是将init重命名为initBase不起作用 – 在我的Base类中,方法init仍然存在! 有没有办法如何解决这个问题,而不是从一开始就将BaseTrait :: init()重命名为BaseTrait :: initBase()(不仅仅是在use语句中)? 我应该将此视为PHP错误并报告吗?这种行为背后有什么合理的吗? 
 正如评论中所述和完整性;从 
 PHP manual section on Traits: 
  
  
  
 然后: 
 因此,添加别名但不会以任何方式替换或影响原始方法.这是预期的行为. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! | 
