PHP函数依赖性是如何工作的?

PHP函数依赖性是如何工作的?,php,laravel,function,dependency-injection,Php,Laravel,Function,Dependency Injection,我这里有一个来自框架Laravel的示例 class UserController extends Controller { public function store(Request $request) { $name = $request->input("name"); } } 我不明白的是,请求是在store()的函数签名中明确定义的 php的类型推断不能确定传递给函数的是什么吗 这会被认为是依赖注入吗 这是方法级依赖项注入。请求被传递到存储

我这里有一个来自框架Laravel的示例

class UserController extends Controller
{
    public function store(Request $request)
    {
        $name = $request->input("name");
    }
}
我不明白的是,请求是在
store()
的函数签名中明确定义的

php的类型推断不能确定传递给函数的是什么吗


这会被认为是依赖注入吗

这是方法级依赖项注入。
请求
被传递到
存储
方法,而不是
存储
方法,该方法知道如何创建
请求
对象

方法签名中的类型提示有两个作用

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

由于这种严格的类型强制,我们知道
$request
参数必须是
request
对象(或后代),并且我们可以依赖其公共接口来使用(您知道
input()
方法将存在)

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


如果要删除类型提示,这将导致两个问题。在抽象级别,它允许您将任何类型的对象,甚至标量值传递给
store()
方法。如果试图对字符串调用
input()
,则会出现问题。在更具体的层面上,这将打破Laravel对控制器方法的自动依赖解析。没有类型提示,Laravel无法知道该方法需要什么对象,因此它不会传入任何内容,因此实际上,您会收到一个错误,表示无法在
null
上调用
input()
(或一个错误,表示存储方法需要一个参数;不确定,未测试)。

这是方法级依赖项注入。
请求
被传递到
存储
方法,而不是
存储
方法,该方法知道如何创建
请求
对象

方法签名中的类型提示有两个作用

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

由于这种严格的类型强制,我们知道
$request
参数必须是
request
对象(或后代),并且我们可以依赖其公共接口来使用(您知道
input()
方法将存在)

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


如果要删除类型提示,这将导致两个问题。在抽象级别,它允许您将任何类型的对象,甚至标量值传递给
store()
方法。如果试图对字符串调用
input()
,则会出现问题。在更具体的层面上,这将打破Laravel对控制器方法的自动依赖解析。如果没有类型提示,Laravel无法知道该方法需要什么对象,因此它不会传入任何内容,因此在现实中,您可能会收到一个错误,表示无法在
null
上调用
input()
(或一个错误,表示存储方法需要一个参数;不确定,未测试)。

Yes,您只需说明您接受的函数数据类型。类/函数不知道如何实例化/创建该对象。如果你想进一步抽象,那么在设置什么是可接受的时使用泛型接口。是的,你只是简单地说明你在函数中接受什么样的数据类型。类/函数不知道如何实例化/创建该对象。如果您想进一步抽象,那么在设置可接受的内容时使用通用接口。