PHP: abstract class ServiceProvider { public App $app; final public function __construct(App &$app) { $this->app = $app; } abstract public function register(); abstract public function boot(); final public static function setup(App &$app, array $providers) { $providers = array_map(fn ($provider) => new $provider($app), $providers); array_walk($providers, fn (ServiceProvider $provider) => $provider->register()); array_walk($providers, fn (ServiceProvider $provider) => $provider->boot()); } } Не очень понятно, зачем автор $app передаёт по ссылке? Это ведь всего лишь переменная для доступа к методам объекта или я не так что-то понимаю?
Чтобы константу не передавали. Или чтобы не забыть, что в PHP объекты "передаются по ссылке" (передаётся копия идентификатора, указывающая на тот же объект).
Это понятно, ок, передали объект по ссылке в setup, зачем тогда в конструкторе указывать, что передаётся объект по ссылке, мы ведь в new $provider($app) передали УЖЕ идентификатор объекта, получается что в конструкторе мы делаем ссылку УЖЕ на идентификатор? Или я запутался? p.s. и зачем публичное свойство, может достаточно защищённого
"Не вся правда" Далее разъясняется, что не псевдоним создаётся, как для обычной переменной, а копия идентификатора, указывающая на тот-же объект, что и оригинальный идентификатор.
ну так зачем ссылаться на идентификатор создавая идентификатор идентификатора --- Добавлено --- @Sail или тут дело в имутабельности?
По идее реализуемый ServiceProvider обязует создавать экземпляры App вне статического метода, вопрос зачем. Интересно было бы глянуть контекст побольше. А зачем защищенное, может достаточно публичного. Нужно больше инфы.
PHP 8.1.9 PHP: <?php class App { } class ServiceProvider { public App $app; final public function __construct(App &$app) { $this->app = $app; } public function getApp(): App { return $this->app; } } $app = new App(); $sp = new ServiceProvider($app); var_dump($sp->getApp()); unset($sp->app); var_dump($sp->getApp()); Код (Text): object(App)#1 (0) { } Fatal error: Uncaught Error: Typed property ServiceProvider::$app must not be accessed before initialization in D:\q.php:19 Stack trace: #0 D:\q.php(27): ServiceProvider->getApp() #1 {main} thrown in D:\q.php on line 19
это абстрактный класс, от него наследуются подгружаемые в setup провайдеры, какой смысл делать свойство публичным для доступа по ссылке, мы же закрыли класс абстрактностью, его экземпляр не создаётся, для доступа в потомках достаточно защищённого свойства