为了使系统名称约定的变体减少,我尝试使用相同的特征名称和函数,并用名称空间将它们封装起来以避免冲突。当环境仅具有类和名称空间,而没有包含特征时,此设置才起作用。
观察:
我确实理解错误消息,由于系统试图加载同名的2个方法而导致冲突。但是,我认为使用不同的名称空间可以解决冲突。
替代解决方案:
保持使用特征的结构,似乎一种选择是在代码中坚持使用相同的方法名称,但使用别名或“代替”来区分系统使用的方法名称。
<?php
// ------------------------------------
namespace namespace_1;
trait TraitSameName
{
function run() {
echo "Hi, from x1" . "\n";
}
}
// ------------------------------------
namespace namespace_2;
trait TraitSameName
{
function run() {
echo "Hi, from x2" . "\n";
}
}
// ------------------------------------
class Build
{
// Traits
use
\namespace_1\TraitSameName,
\namespace_2\TraitSameName
;
}
// ------------------------------------
$build_1 = new namespace_1\Build();
$build_2 = new namespace_2\Build();
$build_1->run();
$build_2->run();
错误打印输出:
PHP Fatal error: Trait method run has not been applied, because there are collisions with other trait methods on namespace_2\Build in Xxx on line 28
想要的打印输出:
Hi, from x1
Hi, from x2