php中的反射,依赖注入与控制反转

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
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值