Ответы пользователя по тегу ООП
  • Инкапсуляция, отсутствие её - проблема?

    Отсутсвие инкапсуляции в данном контексте, очевидно, в первую очередь означает излишне обширный публичный интерфейс. А публичный интерфейс разработчик фреймворка просто так менять не может - нужно соблюдать обратную совместимость. Соответственно, чем больше у нас торчит наружу ушей, тем сложнее поддерживать и развивать фреймворк. Достаточно посмотреть на код Битрикса, например, чтобы увидеть к чему это приводит.
    Думаю, вопрос был именно об этом.
    Ответ написан
    Комментировать
  • Как правильно подобрать архетикуру (ООП) для задачи?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Что бы можно было работать в цикле (при помощи конструкции instanceof) с разными сайтами не думая о том что происходит внутри класса Provider.
    Для этого существует полиморфизм. Instanceof - это антипаттерн.

    По большому счету, замена трейтов - агрегация. Инжектите в конструкторе провайдера нужные обработчики и вызывайте уже их:
    class FooProfileThing implements ProfileThingInterface {}
    
    class FooMessageThing implements MessageThingInterface {}
    
    class FooProvider extends Provider
    {
      public function __constructor($bar)
      {
        $this->bar = $bar;
        $this->profileThing = new FooProfileThing;
        $this->messageThing = new FooMessageThing;
      }
    }

    Таким образом вы соблюдете принцип единственной ответственности и сможете более разумно построить иерархию этих объектов.

    Да и вообще, что это за объекты Profile, Message, News, для которых вы создали интерфейс? Почему Provider одновременно ведет себя как профиль, сообщение и новость? Это сущности действительно однотипны?
    Ответ написан
    5 комментариев
  • Правильная обработка исключений?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Вопрос в том, как правильно их отлавливать при использовании класса? Перехватывать базовое исключение, или лесенкой ловить каждое конкретное?

    Весь смысл использования специальных типов исключений в том, чтобы для каждой нештатной ситуации можно было реализовать свою логику обработки.
    Ответ написан
    Комментировать
  • В чем суть конструкции и как такое возможно?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    class Set implements \ArrayAccess, \Countable, \IteratorAggregate

    Всё дело в том, что этот класс реализует интерфейс ArrayAccess.

    P.S.
    В \Slim\Helper\Set никаких магических методов нет имеется.

    Еще как имеются - https://github.com/slimphp/Slim/blob/2.x/Slim/Help...
    Ответ написан
    3 комментария
  • Класс наследует метод, который не должен реализовывать?

    Это нарушение принципа разделения интерфейса.
    Насколько оно существенно в вашем конкретном случае можете решить только вы, но в целом то, что вам приходится ломать SOLID, говорит об ошибках дизайна.
    Ответ написан
    Комментировать
  • Как передать аргументы в неизвестную функцию?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Вызвать функцию, название которой находится в переменной, можно несколькими способами:
    // Когда аргументы и их количество известно заранее
    // Такой вариант мне кажется самым читабельным
    // Оборачивать в фигурные скобки не обязательно
    // Я это делаю всегда для того, чтобы было видно, что вызов динамический
    $this->obj->{$function}($arg1, $arg2)

    или
    // Подходит как раз для описанного случая
    // Аргументы могут быть любыми и передаются в виде массива
    call_user_func_array([$this->obj, $function], [$arg1, $arg2]);
    Ответ написан
    Комментировать
  • Как передать параметром интерфейс?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    class Test
    {
        public function __construct(SomeInterface $someInterface)
        {
            $this->someInterface = $someInterface;
        }
    }
    
    interface SomeInterface
    {
        public function foo($bar);
    }
    
    class SomeClass implements SomeInterface
    {
        public function foo($bar)
        {
        }
    }
    
    $a = new SomeClass("bar");
    
    $b = new Test($a);
    Ответ написан
    Комментировать