$request1 = Request $request; // представим, что сюда request попал через сервис контейнер
$request2 = Request $request; // представим, что сюда request попал через сервис контейнер
$request1->merge(['1' => 1, '2' => 2]);
dump($request1);
$request2->merge(['3' => 3, '4' => 4]);
dump($request2);
Это специфика именно класса requestэто специфика классов в PHP открой ссылку и ознокомься с документацией
это ларавеловский request, и мне интересно, как он работаетну раз это класс, то работает как и любой другой класс в пхп, поэтому ответ на твой вопрос
Почему в $request2 попали ключи и значения, которые я задавал для первого реквеста?- дан
мне интересно, как он работаетЭто singleton. Тут дело не в том, как работает класс Request, а в том, как работает его резолв внутри Laravel. Поскольку это фундаментальный класс, то его инициализация раскидана по всему фреймворку и сложно дать конкртеную ссылку на код, но в более простом случае нужно смотреть сюда: https://laravel.com/docs/11.x/container#binding-a-...
Обычно же ларавеловский контейнер работает так, что создаёт инстансы классов при указании в конструкторе этих классов. А request ведёт себя как singletonКак автор кода сущность в контейнере зарегистрирует, так она и будет резолвиться: не укажет ничего особого, будет создаваться новый объект каждый раз, а захочет - зарегистрирует как синглтон. Как я уже сказал, в случае с Request всё сложнее, чем просто регистрация синглтона через метод контейнера, но суть такая же.
Дамплю, как видно, два разных объекта класса Request.Вот в чём заключается суть непонимания - oloref думает, что ему контейнер на каждый "запрос" создаст новый экземпляр объекта. Однако, это не так, и паттерн, когда это не так, называется синглтоном и именно его использование приводит к такому поведению. Не понимаю, откуда негодование ¯\_(ツ)_/¯.
"представим, что сюда request попал через сервис контейнер". То есть это экземпляр одного и того же класса.Важно же, что это один и тот же экземпляр. И именно этого автор не понимает, потому что для него любое обращение к контейнеру подразумевает вызов new, это хорошо видно по его комментариям в этом и соседних вопросах. В этом был источник его непонимания в первую очередь, а не в том, что он не понимает присвоение по ссылке (не берусь судить понимает он его или нет на самом деле).
Только один и тот же не потому, что "синглтон", а потому что лежит в контейнере.
контейнер каждый раз создает сервис заново
"синглтон" в данном случае - это дефолтное поведение контейнераНеа, не дефолтное: https://github.com/laravel/framework/blob/3d800c5b...
Иначе это был бы не контейнер, а фабрика.Это уже к Тейлору :)
Хотя возможно непонятки автора в том и заключаются, что он думал, будто контейнер каждый раз создает сервис заново. Хотя совершенно непонятно - зачем.Вы совершенно правы.
public function __construct(UriCutter $uriCutter, UriCutter $uriCutter2)
{
$cutter1 = $uriCutter;
$cutter2 = $uriCutter2;
dump(spl_object_id($cutter1));
dump(spl_object_id($cutter2));
}
$request1 = make(Request::class);
$request2 = make(Request::class);
public function __construct(Request $request)
{
$request1 = $request;
$request2 = $request;
}
@oloref:А вот тут уже зависит от контейнера - если объект в нём зарегистрирован как синглтон, то такой код всё равно вернёт две ссылки на один и тот же объект.
А если вдруг мне понадобится два разных инстанса одного класса, нормальным будет сделать так?:
public function __construct(UriCutter $uriCutter, UriCutter $uriCutter2)