我这里有一个来自框架 Laravel 的例子。
class UserController extends Controller
{
public function store(Request $request)
{
$name = $request->input("name");
}
}
我不明白的是,请求是在store()
的函数签名中显式定义的。
php 的类型推断无法弄清楚传递给函数的内容吗?
这甚至会被认为是依赖注入吗?
这是方法级依赖注入。Request
传递到store
方法中,而不是知道如何创建Request
对象的store
方法。
方法签名中的类型提示执行两项操作。
首先,对于纯 PHP,它强制执行传递给store
方法的参数必须是Request
对象或从Request
继承的对象。如果尝试使用Request
对象(或后代(以外的任何对象调用store()
方法,则会收到错误。
由于这种严格的类型强制,我们知道$request
参数必须是Request
对象(或后代(,我们可以依赖其可用的公共接口(您知道input()
方法将存在(。
其次,对于 Laravel,它告诉 Laravel 容器此方法需要什么类型的对象,以便可以将正确的对象解析出容器并传递给该方法。Laravel的控制器方法是通过容器调用的,这允许方法调用的自动依赖关系解析。
如果要删除类型提示,这将导致两个问题。在抽象级别,它将允许您将任何类型的对象,甚至是标量值传递给store()
方法。如果尝试在字符串上调用input()
,则会遇到问题。在更具体的层面上,这将打破 Laravel 对控制器方法的自动依赖解析。如果没有类型提示,Laravel无法知道该方法需要什么对象,因此它不会传入任何内容,因此实际上您会收到一个错误,说您无法在null
上调用input()
(或者错误表示存储方法需要一个参数;不确定,未测试(。