PHP函数依赖如何工作?

时间:2017-08-04 20:37:57

标签: php laravel function dependency-injection

我在Laravel框架中有一个例子。

class UserController extends Controller
{
    public function store(Request $request)
    {
        $name = $request->input("name");
    }
}

我不明白的是,store()的功能签名中明确定义了请求。

无法通过php的类型推断找出传递给函数的内容吗?

这甚至会被视为依赖注入吗?

1 个答案:

答案 0 :(得分:2)

这是方法级依赖注入。 Request方法被传递到store方法,而不是store方法,知道如何创建Request对象。

方法签名中的类型提示有两件事。

首先,对于普通的PHP,它强制执行传递给store方法的参数必须是Request对象或继承自Request的对象这一事实。如果您尝试使用store()对象(或后代)以外的任何方法调用Request方法,则会出现错误。

由于这种严格的类型强制执行,我们知道$request参数必须是Request对象(或后代),我们可以依赖它的公共接口可供使用(你知道将存在input()方法。

其次,对于Laravel,它告诉Laravel容器此方法需要什么类型的对象,以便可以从容器中解析出正确的对象并将其传递给方法。 Laravel的控制器方法是通过容器调用的,它允许自动依赖解析方法调用。

如果要删除类型提示,则会导致两个问题。在抽象级别,它允许您将任何类型的对象,甚至标量值传递给store()方法。如果您尝试在字符串上调用input(),则会遇到问题。在更具体的层面上,这将打破Laravel对控制器方法的自动依赖性解析。没有类型提示,Laravel无法知道方法需要什么对象,所以它不会传递任何东西,所以实际上你会收到一个错误,说你不能在{{1}上调用input() (或者说存储方法需要一个参数的错误;不确定,没有测试)。