Объединение одного и того же метода в несколько составных черт

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

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(); 

Все мои поиски в Google по этой проблеме просто показывают, как использовать insteadof для перезаписи одного другим.

Редактировать:

Этот вопрос не является дубликатом указанного. При запуске кода с предписанными изменениями получаю

Fatal error: Trait method get has not been applied, because there are collisions with other trait methods on GetUser in /in/hg9ok on line 20

Process exited with code 255.

Спасибо

Не совсем уверен насчет дубликата, но он может указать вам, как получить доступ к обоим методам.

Nigel Ren 07.06.2018 14:44

Вам следует начать с чтения руководства: php.net/manual/en/language.oop5.traits.php. После названия признака нет (). Код, который вы разместили не компилируется из-за этих скобок.

axiac 07.06.2018 14:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
321
1

Ответы 1

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

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

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

Другие вопросы по теме