我一直收到一个php错误,表明该方法不在当前类中,或者存在冲突。参见错误:
Trait method callMe has not been applied, because there are collisions with other trait methods on Src'Classes'A in
C:'wamp'www'src'classes'a.php on line 72
我试过了,但找不到解决办法。这就是我想要实现的目标:
trait A // namespace Src'Traits;
{
function callMe()
{}
}
trait B // namespace Src'PowerTraits;
{
function callMe()
{}
}
class A // Namespace Src'Classes;
{
use 'Src'Traits'A;
use 'Src'PowerTraits'B {
A::callMe insteadof B::callMe;
}
}
当我尝试时
A::callMe insteadof callMe;
我得到以下错误(可以理解,它显然在错误的命名空间中):
Could not find trait Src'Classes'callMe
也尝试过:
'Src'Traits'A::callMe insteadof 'Src'Traits'B::callMe (error, syntax error);
'Src'Traits'A::callMe insteadof B::callMe (error: wrong namespace);
'Src'Traits'A::callMe as NewA (error, collision warning);
'Src'Traits'A::callMe as 'Src'Traits'A::NewA (error, syntax error);
单独放置,发出碰撞警告:
Trait method callMe has not been applied, because there are collisions with other trait methods
当trait和调用类都在不同的命名空间中时,如何覆盖trait方法?
关于A::callMe insteadof B::callMe
- 在使用
insteadof
时,不能使用作用域解析运算符::
(Paamayim-Nekudotayim)命名方法,因为PHP会查找同名的方法。A::callMe insteadof B;
- 您需要使用/import/alias类名,或者引用命名空间为
'Src'Traits'A::callMe insteadof 'Src'PowerTraits'B;
的完全限定类
演示:https://3v4l.org/g1ltH
<?php
namespace Src'Traits
{
trait A
{
function callMe()
{
echo 'Trait A';
}
}
}
namespace Src'PowerTraits
{
trait B
{
function callMe()
{
echo 'PowerTrait B';
}
}
}
namespace Src'Classes
{
class A
{
use 'Src'Traits'A;
use 'Src'PowerTraits'B {
'Src'Traits'A::callMe insteadof 'Src'PowerTraits'B;
}
}
}
namespace
{
(new 'Src'Classes'A)->callMe();
}
Trait A