PHP具有完整的反射 API,提供了对类、接口、函数、方法和扩展进行逆向工程的能力。通过类的反射提供的能力我们能够知道类是如何被定义的,它有什么属性、什么方法、方法都有哪些参数,类文件的路径是什么等很重要的信息。也正式因为类的反射很多PHP框架才能实现依赖注入自动解决类与类之间的依赖关系,这给我们平时的开发带来了很大的方便。 本文主要是讲解如何利用类的反射来实现依赖注入(Dependency Injection),并不会去逐条讲述PHP Reflection里的每一个API,详细的API参考信息请查阅[官方文档][1]
再次声明这里实现的依赖注入非常简单,并不能应用到实际开发中去,可以参考后面的文章[服务容器(IocContainer)][2], 了解Laravel的服务容器是如何实现依赖注入的。
为了更好地理解,我们通过一个例子来看类的反射,以及如何实现依赖注入。
下面这个类代表了坐标系里的一个点,有两个属性横坐标x和纵坐标y。
接下来这个类代表圆形,可以看到在它的构造函数里有一个参数是类的,即类是依赖与类的。
ReflectionClass
下面我们通过反射来对这个类进行反向工程。
把类的名字传递给来实例化一个类的对象。
反射出类的常量
返回一个由常量名称和值构成的关联数组
通过反射获取属性
返回一个由ReflectionProperty对象构成的数组
反射出类中定义的方法
返回ReflectionMethod对象构成的数组
我们还可以通过来单独获取类的构造方法,其返回值为一个对象。
反射出方法的参数
其返回值为ReflectionParameter对象构成的数组。
依赖注入
好了接下来我们编写一个名为的函数,传递类名称给函数返回类的对象,在里它会帮我们注入类的依赖,即在本例中帮我们注入对象给类的构造方法。
定义好方法后我们通过它来帮我们实例化Circle类的对象:
通过上面这个实例我简单描述了一下如何利用PHP类的反射来实现依赖注入,Laravel的依赖注入也是通过这个思路来实现的,只不过设计的更精密大量地利用了闭包回调来应对各种复杂的依赖注入。
领取专属 10元无门槛券
私享最新 技术干货