PHP 函数依赖关系如何工作?



我这里有一个来自框架 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()(或者错误表示存储方法需要一个参数;不确定,未测试(。

最新更新