您的位置:首页 > 编程语言 > PHP开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: