php容器类实现

本文详细介绍了PHP中的依赖注入和反射的概念及使用。通过示例展示了如何使用反射API创建对象并进行依赖注入,同时解释了如何初始化和管理容器列表,以实现动态依赖注入。在代码中,`Container`类扮演了管理对象的角色,能够根据配置创建并注入依赖。文章还提到了`::class`关键字的限制,并提供了相关参考资料。
摘要由CSDN通过智能技术生成

相关概念:

依赖注入:

class test1(Base $base){

}

test1 的依赖注入为Base类,看有的书也叫组合,说是底层代码最好用组合,顶端代码最好用继承。

反射:

用字符串作为类名生成相关对象,方法有很多:https://blog.csdn.net/luyaran/article/details/84339363

这里仅用反射API,包括 ReflectionClass、ReflectionMethod、ReflectionParameter、ReflectionFunction

代码如下:

error_reporting(E_ALL);
class Base {
	public function index($text) {
		echo 'base:' . $text;
	}
}
class Con1 {
	public function __construct(Base $base) {
		$base->index(__CLASS__);
	}
	public function test($text) {
		echo "Con1:" . $text;
	}
}
class Con2 {
	public function Con2(Base $base) {
		$base->index(__CLASS__);
	}
	public function index($text) {
		echo "Con2:" . $text;
	}
}
class Container {
	//容器列表
	public $conList = [];

	public function __construct() {
		$this->initList();
	}
	//数据初始化
	private function initList() {
		//容器名 => 容器类 注入类
		//::class 不可动态编译
		$this->conList = [
			'con1' => ['class' => 'con1'::class, 'param' => ['Base'::class]],
		];
	}
	//获取容器
	public function getCon($conName) {
		if (isset($this->conList[$conName])) {
			$config = $this->conList[$conName];
			$objClass = $this->getClass($config['class'], $config['param']);
			return $objClass;
		} else {
			return false;
		}
	}
	//注册新容器
	public function register($conName, $className, $param = []) {
		if (isset($this->conList[$conName])) {
			return true;
		}
		$this->conList[$conName] = ['class' => $className, 'param' => $param];
	}
	//新建容器对象
	private function getClass($className, $params = []) {
		$class = new ReflectionClass($className);
		$constructInfo = $class->getConstructor();
		$constructName = $constructInfo->name;
		$construct = $class->getMethod($constructName);
		$conParams = $construct->getParameters();
		$paramArr = [];
		if (count($conParams) > 0) {
			foreach ($conParams as $key => $value) {
				$parCLassName = $value->getClass()->name;
				if ($parCLassName == $params[$key]) {
					$paramArr[] = (new ReflectionClass($params[$key]))->newInstance();
				}
			}
		}
		$conObjRef = new ReflectionClass($className);
		$conObj = $conObjRef->newInstanceArgs($paramArr);
		return $conObj;
	}
}
//test
$con = new Container();
$con->getCon('con1')->test('test1');
$con->register('con2', 'Con2'::class, ['Base'::class]);
$con->getCon('con2')->index('test2');

解释:

初始化容器列表,可以设置新容器,添加到列表中。获取实例时创建实例对象,可根据设置进行依赖注入。

注:

::class 不支持动态编译

参考:

https://blog.csdn.net/qq_20678155/article/details/70158374

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lsswear

感谢大佬打赏 q(≧▽≦q)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值