избегать столкновений с чертами — use_once?

У меня есть две черты 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 из этих черт.

8

Решение

Вам нужно прочитать: Решение конфликта

Если две черты вставляют метод с одинаковым именем, фатальная ошибка
производится, если конфликт явно не разрешен.

Для разрешения конфликтов именования между Чертами, используемыми в одном классе,
вместо оператор должен быть использован, чтобы выбрать точно один из
конфликтующие методы.

Поскольку это позволяет исключить только методы, как оператор может быть
используется для включения одного из конфликтующих методов в
другое имя.

Пример:

<?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;
}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]