Чтобы сохранить соглашение об именах систем с уменьшенными вариациями, я пытаюсь использовать одно и то же имя свойства и функцию, инкапсулируя их с пространством имен, чтобы избежать коллизий. Эта настройка работает при наличии среды только с классами и пространством имен, но не при включении признаков.
Наблюдение:
Я понимаю сообщение об ошибке, что есть коллизия из-за того, что система пытается загрузить 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