За последние 24 часа нас посетили 12576 программистов и 660 роботов. Сейчас ищут 380 программистов ...

Есть ли принципиальная разница: мануальный вызов или автовайринг?

Тема в разделе "PHP для новичков", создана пользователем Вероломство, 2 авг 2022.

  1. Вероломство

    [ БАН ]

    С нами с:
    19 июн 2017
    Сообщения:
    573
    Симпатии:
    19
    мануальный

    PHP:
    1. $container = new Container();
    2.  
    3. $application = new Application($container);
    4.  
    5. class Application
    6. {
    7.     private $container;
    8.     private $router;
    9.  
    10.     public function __construct(Container $container)
    11.     {
    12.         $this->container = $container;
    13.  
    14.         $this->router = $this->container->get(Router::class);
    15.     }
    16. }
    автовайринг

    PHP:
    1. $container = new Container();
    2.  
    3. $application = Application::create($container);
    4.  
    5. class Application
    6. {
    7.     private static $container;
    8.     private $router;
    9.  
    10.     public function __construct(Router $router)
    11.     {
    12.         $this->router = $router;
    13.     }
    14.  
    15.     public static function create(Container $container): self
    16.     {
    17.         self::$container = $container;
    18.  
    19.         return self::$container->get(self::class);
    20.     }
    21. }
    Какая принципиальная разница?
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.530
    Симпатии:
    1.277
    Адрес:
    Лень
    вообще ничего не понятно
    --- Добавлено ---
    я тупой наверно
    --- Добавлено ---
    PHP:
    1. class Application
    2. {
    3.     public function __construct(private readonly Container $container)
    4.     {
    5.         //$this->container = $container;
    6.         /* ... */
    7.     }
    8. }
    --- Добавлено ---
    надо кстати у себя прописать "чтение"
    --- Добавлено ---
    во, теперь зае6ись

    PHP:
    1. <?php
    2.  
    3. declare ( strict_types = 1 );
    4.  
    5. namespace Nouvu\Framework\Foundation;
    6.  
    7. use Psr\Container\ContainerInterface;
    8.  
    9. class Application
    10. {
    11.     public function __construct ( private readonly ContainerInterface $ContainerInterface, array $tools )
    12.     {
    13.         foreach ( [ ...$tools, \App :: class => ( fn( ContainerInterface $ContainerInterface ): self => $this ) ] AS $name => $packaging )
    14.         {
    15.             $this -> ContainerInterface -> set( $name, $packaging );
    16.         }
    17.     }
    18.    
    19.     public function __set( string $name, callable $value ): void
    20.     {
    21.         $this -> ContainerInterface -> set( $name, $packaging );
    22.     }
    23.    
    24.     public function __get( string $name ): mixed
    25.     {
    26.         return $this -> ContainerInterface -> get( str_replace ( '.', '\\', $name ) );
    27.     }
    28. }
     
  3. Вероломство

    [ БАН ]

    С нами с:
    19 июн 2017
    Сообщения:
    573
    Симпатии:
    19
    @MouseZver мне в смысле статика мозолит глаза, если у меня в контейнере предусмотрен автовайринг, так может вообще делать сразу

    PHP:
    1. $container = new Container();
    2.  
    3. $application = $container->get(Application::class);
     
  4. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.451
    Симпатии:
    1.718
    Меньше кода в контроллере, а так разницы нету. Я предпочитаю автовайринг
     
    Вероломство нравится это.
  5. Вероломство

    [ БАН ]

    С нами с:
    19 июн 2017
    Сообщения:
    573
    Симпатии:
    19
    вот и я размышляю: зачем мне передавать контейнер либо возвращать статикой сам себя объект, какая-то карусель :)