我从框架Laravel有一个例子。PHP函数依赖如何工作?
class UserController extends Controller
{
public function store(Request $request)
{
$name = $request->input("name");
}
}
我不明白的是,请求store()
函数签名内明确定义。
无法通过php的类型推断找出传入函数的内容?
这甚至会被视为依赖注入吗?
我从框架Laravel有一个例子。PHP函数依赖如何工作?
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不知道该方法需要什么对象,所以它不会传递任何东西,所以实际上你会得到一个错误,说你不能在上调用input()
(或者说错误存储方法需要一个参数;不确定,没有测试)。
是的,你只是简单地说明你接受哪些数据类型进入函数。类/函数不知道如何实例化/创建该对象。如果你想进一步抽象,那么在设置可接受的东西时使用通用的接口。 – JimL