PHP函数依赖性是如何工作的?
我这里有一个来自框架Laravel的示例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的类型推断不能确定传递给函数的是什么吗 这会被认为是依赖注入吗 这是方法级依赖项注入。请求被传递到存储
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,您只需说明您接受的函数数据类型。类/函数不知道如何实例化/创建该对象。如果你想进一步抽象,那么在设置什么是可接受的时使用泛型接口。是的,你只是简单地说明你在函数中接受什么样的数据类型。类/函数不知道如何实例化/创建该对象。如果您想进一步抽象,那么在设置可接受的内容时使用通用接口。