php中的反射,依赖注入与控制反转
2019-06-16 18:40
926 查看
php中的反射,依赖注入与控制反转 一、依赖注入 当A类中使用了B类,那么此时A是依赖于B,因为是B提供的服务,我们可以用普通的方法在A中调用B或者 实例化,比如: public function afun(){ $b = new B(); $b->test(); } 显然这种方式不利于维护。于是,优化的措施是从A外部注入B,这样后期B的改动对A的影响会减小,比如 public function afun(B $b){ $b->test(); } $A = new A(); $B = new B(); $A->afun($B); 这就是依赖注入,也是最初级的注入,不够智能。 控制反转(IOC)是一种思想,依赖注入(DI)是实施这种思想的方法。 二、PHP中的反射机制 反射,其实就是指全方位的解析。 当面对一个类时,其实我们知道的信息有限,比如,某个方法是否是public;获取全部属性等待。所以,想 要更详细的掌控一个类,我们需要对其进行反射。 通常 $obj = new ReflectionClass('className') 来反射类; $method = new ReflectionMethod('className', 'methodName') 来反射类方法。 具体可参考手册,反射常用与于框架中。 三、使用反射来实现依赖自动注入 <?php class B { public function btest(){ echo 'here is b'; } } class A { public function atest(B $bobj, $p = 0){ $bobj->btest(); } public static function astatic(B $bobj, $p = 0){ $bobj->btest(); } } // 方法1、手动注入依赖 $A = new A(); $B = new B(); $A->atest($B); // 方法2、使用PHP反射机制来实现依赖注入,扩展性强,智能 // 反射A类的atest方法 $method = new ReflectionMethod('A', 'atest'); // $method = new ReflectionMethod('A', 'astatic'); $args = []; foreach($method->getParameters() as $getParameters){ /* var_dump($getParameters); 都是 ReflectionParameter 对象 object(ReflectionParameter)#2 (1) { ["name"]=> string(4) "bobj" } object(ReflectionParameter)#3 (1) { ["name"]=> string(4) "p" } */ $class = $getParameters->getClass(); /* var_dump($class); // 普通变量的 $class 为 null object(ReflectionClass)#4 (1) { ["name"]=> string(1) "B" } */ if($class){ $args[] = new $class->name; } } // 带参数执行,如果调用静态方法astatic,则第一个参数为 null $method->invokeArgs(new A(), $args); //$method->invokeArgs(null, $args); // 输出为 here is b
相关文章推荐
- 依赖注入是控制反转的一种实例,也叫反射,运行时从配置文件字符串来创建类,插件思想降低耦合度
- php之依赖注入和控制反转
- 谈谈php依赖注入和控制反转
- 利用反射简单模拟Spring的控制反转(Ioc)和依赖注入(DI)
- 聊一聊PHP的依赖注入(DI) 和 控制反转(IoC)
- PHP控制反转(IOC)和依赖注入(DI)
- PHP控制反转(IOC)和依赖注入(DI)
- PHP的依赖注入(DI) 和 控制反转(IoC)
- 谈谈php里的IOC控制反转,DI依赖注入
- PHP控制反转(IOC)和依赖注入(DI)
- PHP控制反转(IOC)和依赖注入(DI)
- 理解php依赖注入和控制反转
- PHP 依赖注入和控制反转再谈(二)
- 反射机制、依赖注入、控制反转
- php 依赖注入 和控制反转
- 对依赖注入,控制反转,反射的理解
- 理解php依赖注入和控制反转
- PHP控制反转(IOC)和依赖注入(DI)
- 控制反转(Inversion of Control)与依赖注入(Dependency Injection)
- 控制反转与依赖注入