这是Thinkphp5.0的源代码中think/app这个类文件的run方法,他在形参中直接指定request是起什么作用?
是不是当前面有自动加载函数的时候,这样声明就会立即把对应的request类文件加载进来?
另外我在看依赖注入的概念的时候也看过这种写法,请问他和依赖注入之间又有什么关系?
认证高级PHP讲师
很经典的问题!!!这是type hint,指定该参数是个Request对象,这样容器会自动解析这个对象,这就是Method Injection,如果不指定就会报错找不到$request这个是什么类型变量。Independency Injection包括Method Injection 和 Constructor Injection。
Method Injection
Independency Injection包括Method Injection 和 Constructor Injection。
容器自动解析这个对象,这个技巧使用了PHP的反射技术,主要涉及的类一般包括ReflectionClass, ReflectionMethod。
ReflectionClass, ReflectionMethod。
想要深入了解这块知识,最好读一下TP它的容器部分的源码就知道了。Laravel容器源码解读可看这篇文章:Laravel学习笔记之Container源码解析
在静态语言里面不都是有数据类型么?所以限定也很正常,为了防止其他类型传入。
1、Thinkphp5.0的源代码中think/app这个类文件的run方法,他在形参中直接指定request是起什么作用? 答:应该是指定参数,为了防止参数类型不对。 2、是不是当前面有自动加载函数的时候,这样声明就会立即把对应的request类文件加载进来? 答:不是。这里只是把一个request的对象注入进来,做一些事。 3、另外我在看依赖注入的概念的时候也看过这种写法,请问他和依赖注入之间又有什么关系? 答:这是依赖注入。
只是限定一下参数类型
public function one (int a, string b) { //...... }
当访问这个one方法的时候,如果传入的参数不符合限定要求,则会抛出ERROR;
one
Type error: Argument 1 passed one() must be of the type integer
use ......\Order; class OrderRepository { public function create (Order $order) { //...... } }
当你访问这个OrderRepository下的create方法的时候,$order就是Order这个类的实例;
OrderRepository
create
$order
Order
$order = Object(......\Order)
这个问题牵扯的东西比较多我先回答第一个问题参数中的Request是干什么用的Requset的目的就是限定参数, 限定这个变量只能传入指定的类, 类的子类, 实现了接口的类的对象这样有一个好处就是我们可以调用该对象内部的方法 而不担心这个方法是否存在!
第二个问题动态加载这个和这个参数没有什么关系!
第三个问题依赖注入我了解的也不是特别多, 有几种实现!如果参数限定是一个类, 我们就可以借助反射自动把变量注入进去!但是如果是一个接口那就还需要自己指定对应的类才行!我的这些说法也不一定都对! 你可以自己在搜索一下
Requset的目的就是限定参数, 限定这个变量只能传入
1.可以让编辑器 $request 变量的类型,比如Requests有哪里方法,哪些属性2.方法调用时可以到传入参数的类型进行限制
除了上边楼上说的这些以外,使代码显得规范,对于那些想阅读源代码的人来说是一个很好的提示
红框框出的那个Request不理解是什么意思,是php的固定写法还是这个框架独有的?
很经典的问题!!!
这是type hint,指定该参数是个Request对象,这样容器会自动解析这个对象,这就是
Method Injection
,如果不指定就会报错找不到$request这个是什么类型变量。Independency Injection包括Method Injection 和 Constructor Injection。
容器自动解析这个对象,这个技巧使用了PHP的反射技术,主要涉及的类一般包括
ReflectionClass, ReflectionMethod。
想要深入了解这块知识,最好读一下TP它的容器部分的源码就知道了。
Laravel容器源码解读可看这篇文章:Laravel学习笔记之Container源码解析
在静态语言里面不都是有数据类型么?
所以限定也很正常,为了防止其他类型传入。
只是限定一下参数类型
1、设置参数类型
当访问这个
one
方法的时候,如果传入的参数不符合限定要求,则会抛出ERROR;2、依赖注入
当你访问这个
OrderRepository
下的create
方法的时候,$order
就是Order
这个类的实例;这个问题牵扯的东西比较多
我先回答第一个问题参数中的Request是干什么用的
Requset的目的就是限定参数, 限定这个变量只能传入
指定的类, 类的子类, 实现了接口的类的对象
这样有一个好处就是我们可以调用该对象内部的方法 而不担心这个方法是否存在!
第二个问题
动态加载这个和这个参数没有什么关系!
第三个问题
依赖注入我了解的也不是特别多, 有几种实现!
如果参数限定是一个类, 我们就可以借助反射自动把变量注入进去!
但是如果是一个接口那就还需要自己指定对应的类才行!
我的这些说法也不一定都对! 你可以自己在搜索一下
Requset的目的就是限定参数, 限定这个变量只能传入
1.可以让编辑器 $request 变量的类型,比如Requests有哪里方法,哪些属性
2.方法调用时可以到传入参数的类型进行限制
除了上边楼上说的这些以外,使代码显得规范,对于那些想阅读源代码的人来说是一个很好的提示
红框框出的那个Request不理解是什么意思,是php的固定写法还是这个框架独有的?