У меня есть две черты PHP, каждая из которых наследует одну и ту же третью черту:
trait C {
public function smallTalk() {
echo 'c';
}
}
trait A {
use C;
public function ac() {
echo 'a'.smallTalk();
}
}
trait B {
use C;
public function bc() {
echo 'b'.smallTalk();
}
}
И я хочу использовать их обоих в классе:
class D {
use A, B;
public function acbc() {
echo ac().bc();
}
}
но я продолжаю получать ошибку
Неустранимая ошибка: метод черты smallTalk не был применен, потому что на D есть столкновения с другими методами черты
я знаю use_once
это не вещь, но я ищу ту же функциональность, что require_once
или же include_once
обеспечивает, но для черт. Этот пример упрощен. Мой настоящий C
имеет много методов и наследуется более чем двумя признаками, поэтому я не хочу повторять длинную строку insteadof
каждый раз, когда я использую более 1 из этих черт.
Вам нужно прочитать: Решение конфликта
Если две черты вставляют метод с одинаковым именем, фатальная ошибка
производится, если конфликт явно не разрешен.Для разрешения конфликтов именования между Чертами, используемыми в одном классе,
вместо оператор должен быть использован, чтобы выбрать точно один из
конфликтующие методы.Поскольку это позволяет исключить только методы, как оператор может быть
используется для включения одного из конфликтующих методов в
другое имя.
Пример:
<?php
trait A {
public function smallTalk() {
echo 'a';
}
public function bigTalk() {
echo 'A';
}
}
trait B {
public function smallTalk() {
echo 'b';
}
public function bigTalk() {
echo 'B';
}
}
class Talker {
use A, B {
B::smallTalk insteadof A;
A::bigTalk insteadof B;
}
}
class Aliased_Talker {
use A, B {
B::smallTalk insteadof A;
A::bigTalk insteadof B;
B::bigTalk as talk;
}
}
Других решений пока нет …