#php #class #laravel #inversion-of-control
#php #класс #laravel #инверсия управления
Вопрос:
Если вы привязываете класс к IoC…
App::bind('Thing', function() {
return new ThingOne;
});
Тогда экземпляр ThingOne
объекта никогда не будет создан, если вы не вызовете App::make('Thing')
. Это хорошо.
Однако, если вы попытаетесь перезаписать эту привязку:
App::bind('Thing', function() {
return new ThingOne;
});
App::bind('Thing', function() {
return new ThingTwo;
});
App::bind('Thing', function() {
return new ThingThree;
});
… затем будут созданы ThingTwo
объект и ThingThree
объект (и вызваны их конструкторы), даже если вы никогда не вызывали App::make('Thing')
! Это плохо! Почему и как это можно предотвратить? Какой цели служит IoC, если не для того, чтобы позволить нам перезаписывать привязки, чтобы мы могли расширять пакеты и еще много чего? (Это то, что я хотел бы сделать: привязать классы к IoC в моих пакетах, а затем при необходимости перезаписать их при реализации этих пакетов в других проектах.)
кстати, это происходит независимо от того, используете вы bind()
или singleton()
без разницы.
Большое вам спасибо за любые рекомендации.
Комментарии:
1. Вы пытались вызвать App::offsetUnset(‘Thing’) перед повторной привязкой объекта?
2. @FractalizeR у меня не было — это работает, спасибо!
Ответ №1:
Проблема, похоже IlluminateContainerContainer
, заключается в rebound
методе. Этот метод логически вызывается только при повторной привязке, поэтому он вызывается не в первый раз, а в последующие разы. И вы можете видеть, что экземпляр создается при подготовке к обратным вызовам восстановления.
/**
* Fire the "rebound" callbacks for the given abstract type.
*
* @param string $abstract
* @return void
*/
protected function rebound($abstract)
{
$instance = $this->make($abstract);
foreach ($this->getReboundCallbacks($abstract) as $callback)
{
call_user_func($callback, $this, $instance);
}
}
FractalizeR прав, вызов App::offsetUnset('Thing')
перед повторной привязкой не вызывает метод __construct .
Комментарии:
1. А, понятно. Спасибо за ваше время, dwenaus, и спасибо вам и Fractilize за решение.