что это значит под «типизированными объектами»?

#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 с указанием типа рассматривается как типизированный объект, а параметр, который не имеет указания типа, не будет типизированным объектом или его нетипизированным объектом.