"typed objects" 是什么意思?
what does it mean by "typed objects"?
在 laravel 的文档中通过此 link 获得容器服务:https://laravel.com/docs/7.x/container
在标题下方:“Binding Typed Variadics”你会发现这个:
有时,您可能有一个 class,它使用可变构造函数参数接收类型化 object 的数组。
那么输入的是什么 object?
然后什么是未类型化的object?
代码:
class Firewall
{
protected $logger;
protected $filters;
public function __construct(Logger $logger, Filter ...$filters)
{
$this->logger = $logger;
$this->filters = $filters;
}
}
语句 ...$filters
意味着其他所有内容都应该进入 $filters
数组,而 Filter ...$filters
意味着该数组的每个项目都必须是过滤器 class 的实例.
所以 class 的参数是类型提示考虑类型化对象
没有类型提示的参数不会是类型化对象或其非类型化对象。
由于 PHP 是一种解释型语言,因此您拥有动态类型系统。这意味着,例如,一个变量可以保存多种类型的值:
$foo = "Now I'm a string";
$foo = 42; // And now I'm a number
现在问题变成了“类型对象”适合的位置。在 PHP Version 5 type declarations got introduced, because the dynamic type system imposes some problems. First and foremost you loose the ability to have static type checking.
例如,以下函数可能会出现异常:
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 解释器可以使用它来推理函数参数(和 return 类型等)。
此外,现在我们已经有了类型,我们可以使用一种称为 reflection 的技术来反省函数或更确切地说是方法期望传递给什么以提供适当的对象。
所以绕一圈回答你的问题:
类型化对象仅意味着类型提示方法参数,因此 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;
}
}
附加信息:
您想要注入依赖项而不是在 类 内部创建它们的原因是为了在顶部获得 inversion of control, preferably by injecting interfaces so you get loose coupling。
在 laravel 的文档中通过此 link 获得容器服务:https://laravel.com/docs/7.x/container
在标题下方:“Binding Typed Variadics”你会发现这个:
有时,您可能有一个 class,它使用可变构造函数参数接收类型化 object 的数组。
那么输入的是什么 object?
然后什么是未类型化的object?
代码:
class Firewall
{
protected $logger;
protected $filters;
public function __construct(Logger $logger, Filter ...$filters)
{
$this->logger = $logger;
$this->filters = $filters;
}
}
语句 ...$filters
意味着其他所有内容都应该进入 $filters
数组,而 Filter ...$filters
意味着该数组的每个项目都必须是过滤器 class 的实例.
所以 class 的参数是类型提示考虑类型化对象
没有类型提示的参数不会是类型化对象或其非类型化对象。
由于 PHP 是一种解释型语言,因此您拥有动态类型系统。这意味着,例如,一个变量可以保存多种类型的值:
$foo = "Now I'm a string";
$foo = 42; // And now I'm a number
现在问题变成了“类型对象”适合的位置。在 PHP Version 5 type declarations got introduced, because the dynamic type system imposes some problems. First and foremost you loose the ability to have static type checking.
例如,以下函数可能会出现异常:
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 解释器可以使用它来推理函数参数(和 return 类型等)。 此外,现在我们已经有了类型,我们可以使用一种称为 reflection 的技术来反省函数或更确切地说是方法期望传递给什么以提供适当的对象。
所以绕一圈回答你的问题: 类型化对象仅意味着类型提示方法参数,因此 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;
}
}
附加信息: 您想要注入依赖项而不是在 类 内部创建它们的原因是为了在顶部获得 inversion of control, preferably by injecting interfaces so you get loose coupling。