php 容器类,php 容器实现依赖注入

本文介绍了PHP中的依赖注入原理,通过容器类实现类的实例化并管理依赖关系。讲解了make方法的使用,以及如何通过app全局函数简化调用。核心展示了如何解析构造函数参数并注入实例,以提高代码的灵活性和可维护性。
摘要由CSDN通过智能技术生成

依赖注入是通过 php 的映射函数,解析到类在实例化的时候所依赖的类,直接将类实例化

namespace Core;

/**

* 容器文件

* Class Container

* @package Core

*/

class Container

{

/**

* @var array 实例化的类

*/

protected $binds = [];

/**

* 获取一个类的实例化 因为实例化的时候参数都是固定的,所以可以使用此数组方法

* @param $class

* @param array $params

* @return mixed

* @throws \ReflectionException

*/

public function make($class, array $params = [])

{

if (isset($this->binds[$class])) {

return $this->binds[$class];

}

return $this->binds[$class] = $this->resolve($class, $params);

}

/**

* 移除某个类的实例

* @param $class

* @return $this

*/

public function removeClass($class)

{

unset($this->binds[$class]);

return $this;

}

/**

* 解析一个类的构造函数,并且实例化

* @param $abstract

* @param $request_params

* @return mixed

* @throws \ReflectionException

*/

protected function resolve($abstract, $request_params)

{

// 1. 获取构造函数

$constructor = (new \ReflectionClass($abstract))->getConstructor();

// 2.没有构造函数,则直接返回类的实例化

if (is_null($constructor)) {

return new $abstract;

}

// // 3. 如果是配置中的类,则直接获取配置参数实例化

// $isProviderClass = $this->getProviderClass($abstract);

// if ($isProviderClass) {

// return $isProviderClass;

// }

// 获取构造函数中的参数

$params = $constructor->getParameters();

$arguments = [];

foreach ($params as $param) {

if (is_null($param->getClass())) {

if (is_null($request_params[$param->getPosition()])) {

// 如果实参没又传递,则终止循环

break;

}

$arguments[] = $request_params[$param->getPosition()]; // 对应的位置赋值对应的参数

// 参数不是类

} else {

$arguments[] = $this->make($param->getClass()->getName());

}

}

return new $abstract(...$arguments);

}

// /**

// * 如果是 config/app.php 的 privider 数组中的函数,则直接获取配置中的参数进行实例化

// * @param $class

// * @return bool

// * @throws \ReflectionException

// */

// protected function getProviderClass($class)

// {

// // 如果是 config/app.php 里面绑定的,则获取相应的实例化即可

// if (array_key_exists($class, config('app', 'providers'))) {

// return new $class(...config('app', 'providers.' . $class));

// }

// return false;

// }

}

封装一个全局函数

if (!function_exists('app')) {

/**

* 获取一个类的实例化

* @param $class

* @param array $params

* @return mixed

* @throws ReflectionException

*/

function app($class, $params = [])

{

static $container;

if (!$container) {

$container = new \Core\Container();

}

return $container->make($class, $params);

}

}

使用

比如有一个 test 类

app(Test::class); 即可得到 new Test();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值