За последние 24 часа нас посетили 17712 программистов и 1721 робот. Сейчас ищет 851 программист ...

Паттерны

Тема в разделе "PHP для новичков", создана пользователем Dimon2x, 1 май 2018.

  1. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    Какой лучше использовать для структуры сайта: singleton или dependency injection?
     
  2. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    очень простой паттерн))

    я до сих пор не разобрался как контейнерами этими пользоваться.. вместо них использую сейчас реестр)
     
  3. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    В теории DI, на практике - от задачи зависит, и от того, если перспектива дальнейшего допиливания или это одноразовый проект.

    DI если абсолютно чисто использовать, то получится, что ты потом, поменяв одну строчку в конфиге, можешь использовать вместо класса A класс B (при условии, что они реализуют один интерфейс), или даже подставлять разные реализации в зависимости от условий запуска. С синглтонами так не получится
    --- Добавлено ---
    DI-контейнер - почти тот же реестр, только (при хорошей реализации) с плюшками, типа автоматической подстановкой в конструкторы
     
  4. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    @mkramer это хороший пример или плохой? Взял с хабра

    PHP:
    1. <?php
    2.  
    3. // DI container pattern:
    4. class SomeComponent
    5. {
    6.     public function doSomething()
    7.     {
    8.     }
    9. }
    10.  
    11. class App
    12. {
    13.     public function __construct(SomeComponent $theComponent)
    14.     {
    15.         $this->theComponent = $theComponent;
    16.     }
    17.  
    18.     public function run()
    19.     {
    20.         $this->theComponent->doSomething();
    21.     }
    22. }
    23.  
    24. class DIContainer
    25. {
    26.     public function get($className)
    27.     {
    28.         switch ($className) {
    29.             case SomeComponent::class:
    30.                 return new SomeComponent;
    31.             case App::class:
    32.                 return new App($this->get(SomeComponent::class));
    33.             default:
    34.                 throw new Exception;
    35.         }
    36.     }
    37. }
    38.  
    39. $DIContainer = new DIContainer();
    40. $app = $DIContainer->get(App::class);
    41. $app->run();
     
  5. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    для какого сайта?
     
  6. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
  7. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    оно так не работает.
    что лучше: лопата или экскаватор?
    что лучше: совок или бульдозер?
    что лучше: лодка или танкер?
     
  8. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    @igordata я не понял вопроса
     
  9. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    @Dimon2x, это показано, как быстро на коленке собрать DI-контейнер. Ради демонстрации, что это за хрень такая. В реале я бы таким примитивом не пользовался, а взял что-нибудь готовое: в Laravel и Yii2 прекрасные DI-контейнеры, есть и фреймворконезависимые, от PHP League или вот этот: php-di.org

    P.S. если придераться, то в этот контейнер нельзя ничего записать, а это плохо.
     
  10. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    Оценка лучше/хуже всегда зависит от задачи :) Когда нет конкретной задачи, без разницы что использовать :)
    --- Добавлено ---
    ИМХО, singleton и dependency injection вообще не сравнимые вещи. Как горячее и зелёное.
     
  11. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну я читал рекомендацию не пользоваться синглтонами, а заносить их в DI-контейнеры. Тем более, что многие контейнеры позволяют отметить вносимый объект, как синглтон.
     
  12. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    Они решают разные задачи, следовательно несравнимы и не являются заменой друг другу, я так это вижу. :)

    То, что одна и та же реализация может сочетать в себе признаки разных паттернов, это да. А также в зависимости от места использования, один и тот же класс может выступать в разной роли.
     
  13. Dilon

    Dilon Активный пользователь

    С нами с:
    4 май 2014
    Сообщения:
    119
    Симпатии:
    4
    Адрес:
    соседний двор
    В структуре приложения могут быть использованы разные шаблоны. Синглтон обычно для подключения к базе и т.п. Иньекция зависимости? Зависит от того какой функционал ты хочешь реализовать? В твоем приложении могут быть различные шаблоны, если конечно они уместны и их использование оправдано.