За последние 24 часа нас посетили 21818 программистов и 1077 роботов. Сейчас ищут 664 программиста ...

Обязательна ли тут ссылка?

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

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

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

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    PHP:
    1. abstract class ServiceProvider
    2. {
    3.     public App $app;
    4.  
    5.     final public function __construct(App &$app)
    6.     {
    7.         $this->app = $app;
    8.     }
    9.  
    10.     abstract public function register();
    11.     abstract public function boot();
    12.  
    13.     final public static function setup(App &$app, array $providers)
    14.     {
    15.         $providers = array_map(fn ($provider) => new $provider($app), $providers);
    16.  
    17.         array_walk($providers, fn (ServiceProvider $provider) => $provider->register());
    18.         array_walk($providers, fn (ServiceProvider $provider) => $provider->boot());
    19.     }
    20. }
    Не очень понятно, зачем автор $app передаёт по ссылке? Это ведь всего лишь переменная для доступа к методам объекта или я не так что-то понимаю?
     
  2. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    Чтобы константу не передавали.
    Или чтобы не забыть, что в PHP объекты "передаются по ссылке" (передаётся копия идентификатора, указывающая на тот же объект).
     
    Вероломство нравится это.
  3. Вероломство

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

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    Это понятно, ок, передали объект по ссылке в setup, зачем тогда в конструкторе указывать, что передаётся объект по ссылке, мы ведь в new $provider($app) передали УЖЕ идентификатор объекта, получается что в конструкторе мы делаем ссылку УЖЕ на идентификатор?

    Или я запутался?

    p.s. и зачем публичное свойство, может достаточно защищённого
     
    #3 Вероломство, 25 авг 2022
    Последнее редактирование: 25 авг 2022
  4. Вероломство

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

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    This is not completely true - там кстати написано.
     
  5. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    "Не вся правда" :)
    Далее разъясняется, что не псевдоним создаётся, как для обычной переменной, а копия идентификатора, указывающая на тот-же объект, что и оригинальный идентификатор.
     
  6. Вероломство

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

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    ну так зачем ссылаться на идентификатор создавая идентификатор идентификатора
    --- Добавлено ---
    @Sail или тут дело в имутабельности?
     
  7. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    По идее реализуемый ServiceProvider обязует создавать экземпляры App вне статического метода, вопрос зачем. Интересно было бы глянуть контекст побольше.
    А зачем защищенное, может достаточно публичного.

    Нужно больше инфы.
     
  8. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    861
    Симпатии:
    132
    PHP 8.1.9
    PHP:
    1. <?php
    2.  
    3. class App
    4. {
    5.  
    6. }
    7.  
    8. class ServiceProvider
    9. {
    10.   public App $app;
    11.  
    12.   final public function __construct(App &$app)
    13.   {
    14.     $this->app = $app;
    15.   }
    16.  
    17.   public function getApp(): App
    18.   {
    19.     return $this->app;
    20.   }
    21. }
    22.  
    23. $app = new App();
    24. $sp = new ServiceProvider($app);
    25. var_dump($sp->getApp());
    26. unset($sp->app);
    27. var_dump($sp->getApp());
    Код (Text):
    1. object(App)#1 (0) {
    2. }
    3.  
    4. Fatal error: Uncaught Error: Typed property ServiceProvider::$app must not be accessed before initialization in D:\q.php:19
    5. Stack trace:
    6. #0 D:\q.php(27): ServiceProvider->getApp()
    7. #1 {main}
    8.   thrown in D:\q.php on line 19
     
    Вероломство нравится это.
  9. Вероломство

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

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    это абстрактный класс, от него наследуются подгружаемые в setup провайдеры, какой смысл делать свойство публичным для доступа по ссылке, мы же закрыли класс абстрактностью, его экземпляр не создаётся, для доступа в потомках достаточно защищённого свойства