#php #laravel #object #containers #typed
#php #laravel #объект #контейнеры #напечатанный #типизированный
Вопрос:
в документации laravel для контейнерного сервиса по этой ссылке:https://laravel.com/docs/7.x/container
под заголовком: «Привязка типизированных переменных» вы найдете это : иногда у вас может быть класс, который получает массив типизированных объектов, используя аргумент конструктора variadic.
итак, что такое типизированный объект?
и впоследствии, что такое нетипизированный объект?
код:
class Firewall
{
protected $logger;
protected $filters;
public function __construct(Logger $logger, Filter ...$filters)
{
$this->logger = $logger;
$this->filters = $filters;
}
}
Комментарии:
1. Это означает параметр, который одновременно является переменным и указывает на тип, как
Filter ...$filters
в примере.Filter
является классом и...
указывает на переменный параметр.
Ответ №1:
Поскольку PHP является интерпретируемым языком, у вас есть динамическая система типов. Это означает, что, например, переменная sinlge может содержать значения нескольких типов:
$foo = "Now I'm a string";
$foo = 42; // And now I'm a number
Теперь возникает вопрос, куда вписываются «типизированные объекты». В PHP версии 5 были введены объявления типов, потому что система динамических типов создает некоторые проблемы. Прежде всего, вы теряете возможность статической проверки типов.
Например, следующая функция может пропустить:
function doSomething($a, $b)
{
// imagine costly and long running operation here...
return $a $b;
}
echo doSomething(1, 2); // -> 3
echo doSomething('hello ', 'world'); // -> Would result in an error, but only at runtime
Для противодействия введенным подсказкам типа, которые интерпретатор PHP может использовать для рассуждений о параметрах функции (и типах возврата и т.д.).
Кроме того, теперь, когда у нас есть типы, мы можем использовать технику, называемую отражением, для анализа того, что функция или, скорее, метод ожидает передать, чтобы предоставить соответствующие объекты.
Итак, чтобы пройти полный круг и ответить на ваш вопрос: типизированный объект просто означает тип, указывающий на параметр метода, поэтому сервисный контейнер laravel может определить, какой объект вы хотели бы ввести в свой метод.
// not using typed objects:
class Firewall
{
protected $logger;
protected $filters;
public function __construct($logger, ...$filters)
{
$this->logger = $logger;
$this->filters = $filters;
}
}
// using typed objects:
class Firewall
{
protected $logger;
protected $filters;
public function __construct(Logger $logger, Filter ...$filters)
{
$this->logger = $logger;
$this->filters = $filters;
}
}
Дополнительная информация:
Причина, по которой вы хотите внедрить свои зависимости, а не создавать их внутри самих ваших классов, заключается в том, чтобы получить инверсию управления, предпочтительно путем внедрения интерфейсов, чтобы вы получили слабую связь сверху.
Ответ №2:
оператор ...$filters
означает, что все остальное должно входить в $filters
массив, а Filter ...$filters
означает, что каждый элемент этого массива должен быть экземпляром класса filter.
таким образом, параметр класса witch с указанием типа рассматривается как типизированный объект, а параметр, который не имеет указания типа, не будет типизированным объектом или его нетипизированным объектом.