За последние 24 часа нас посетили 20497 программистов и 1010 роботов. Сейчас ищут 360 программистов ...

Реализация интерфейса в трейте и в методе

Тема в разделе "Прочие вопросы по PHP", создана пользователем Grihanoff, 26 фев 2020.

  1. Grihanoff

    Grihanoff Новичок

    С нами с:
    26 фев 2020
    Сообщения:
    5
    Симпатии:
    0
    Всем привет. У меня в интерфейсе объявлено два метода, один реализован в трейте, второй в теле класса в __set()
    Т.е. у меня идет заполнение объекта в сеттере, я не могу в нём сделать всю реализацию и положить в трейт, специфический метод реализован в трейте. Мне не нравится, что часть реализации интерфейса ушла в трейт, а часть в класс.
    Абстрактный класс тоже не подходит, т.к. просится множественное наследование.
    Собственно, вопрос можно свести к тому, что нормально ли когда часть интерфейса реализуется в классе, а часть в трейте?
    Нутром чую, что нет и вопрос в том - как это можно грамотно развести? __set() is must have
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    Код покажи
    --- Добавлено ---
    Если рассуждать о сферических конях в вакууме:
    Хочешь выполнить контракт интерфейса — реализуй его без магии. Это обстоятельство непреодолимой силы.

    Вот теперь объясни за магию: интерфейс объявляет сигнатуры методов. А __set() реализует магию свойств, а не методов. Как ты ухитрился их столкнуть лбами?
     
  3. Grihanoff

    Grihanoff Новичок

    С нами с:
    26 фев 2020
    Сообщения:
    5
    Симпатии:
    0
    Показывать в принципе нечего, в некоторых объектах, нужно обязательно реализовать метод __set(), а внутри метода, специфическую задачу свойств этого объекта.

    Код (Text):
    1. class Some implements SpecificInterface {
    2.    
    3.     use specificPropertiesTrait;
    4.  
    5.     public function __set($name, $value) {
    6.         $this->specificProperties($name, $value);
    7.     }
    8. }
    9.  
    10. interface SpecificInterface {
    11.     public function __set($name, $value);
    12.  
    13.     public function specificProperties($name, $value);  
    14. }
    15.  
    16. trait specificPropertiesTrait {
    17.  
    18.     public function specificProperties($name, $value) {
    19.         //
    20.     }
    21. }
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    магический методв интерфейсе это бессмыслица. раз ты захотел сохранить коня сферическим, больше подсказать нечего.