Цепной один и тот же метод в нескольких составных чертах

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

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.

Спасибо

0

Решение

Принципиально нет, вы не можете достичь того, что вы описываете. Техническая причина в том, что вы получите фатальную ошибку, если попытаетесь использовать более одной черты с одинаковыми именами методов (см. Часть «Разрешение конфликтов» в документация) и вы не можете выборочно получить доступ к методу из черты (т.е. UserLevel::get) но на самом деле это либо недоразумение, либо злоупотребление чертами.

Черты существуют для горизонтальной композиции функциональности, и ключевая часть вашего примера, которая показывает, что это не так, является чертой «SpecialUser». Если это действительно особый пользователь, то почему это не подкласс «Пользователь» с функциональностью, которую вы описываете, а не чертой?

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

0

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

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

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