2017-08-04 146 views
0

我从框架Laravel有一个例子。PHP函数依赖如何工作?

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

我不明白的是,请求store()函数签名内明确定义。

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

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

+0

是的,你只是简单地说明你接受哪些数据类型进入函数。类/函数不知道如何实例化/创建该对象。如果你想进一步抽象,那么在设置可接受的东西时使用通用的接口。 – JimL

回答

2

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

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

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

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

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

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