Я пытаюсь запустить две функции из двух отдельных черт, которые будут применяться в одном классе, но последовательно одно добавление к другому. Простой пример показан ниже
trait UserLevel{
public function get(){
echo 'World';
}
}
trait SpecialUser{
use UserLevel {
UserLevel::get as userGet;
}
public function get(){
echo 'Hello ';
$this->userGet();
}
}
Class GetUser{
use UserLevel, SpecialUser;
}
$user = new GetUser;
$user->get();
Все мои поиски по этому вопросу просто показывают, как использовать insteadof
переписать одно с другим.
Редактировать:
Этот вопрос не является дубликатом упомянутого. При запуске кода с заданными изменениями я получаю
Неустранимая ошибка: метод черты get не был применен, потому что есть
столкновения с другими методами trait в GetUser в / in / hg9ok в строке 20Процесс завершен с кодом 255.
Спасибо
Принципиально нет, вы не можете достичь того, что вы описываете. Техническая причина в том, что вы получите фатальную ошибку, если попытаетесь использовать более одной черты с одинаковыми именами методов (см. Часть «Разрешение конфликтов» в документация) и вы не можете выборочно получить доступ к методу из черты (т.е. UserLevel::get
) но на самом деле это либо недоразумение, либо злоупотребление чертами.
Черты существуют для горизонтальной композиции функциональности, и ключевая часть вашего примера, которая показывает, что это не так, является чертой «SpecialUser». Если это действительно особый пользователь, то почему это не подкласс «Пользователь» с функциональностью, которую вы описываете, а не чертой?
Это вопрос того, чего вы пытаетесь достичь здесь — не с точки зрения кода, а более целостно — и применения ООП к этому, а не к тому, что, кажется, происходит здесь, а наоборот.
Других решений пока нет …