依赖注入,控制反转容器(ioc)
来源:互联网 发布:网络言论自由弊端事例 编辑:程序博客网 时间:2024/05/18 13:45
class Container{ protected $bindings = []; protected $resolved = []; protected $instances = []; public function make($className) { return $this->resolve($className); } public function singleton($className, Closure $resolver = null) { return $this->bind($className, $resolver, true); } public function bind($className, Closure $resolver = null, $shared = false) { if (is_null($resolver)) { $resolver = $className; } $this->bindings[$className] = compact('resolver', 'shared'); } protected function resolve($className) { if (isset($this->instances[$className])) { return $this->instances[$className]; } $concrete = $this->getConcrete($className); $object = $this->build($concrete); if ($this->isShared($className)) { $this->instances[$className] = $object; } $this->resolved[$className] = true; return $object; } protected function getConcrete($className) { if (isset($this->bindings[$className])) { return $this->bindings[$className]['resolver']; } return $className; } protected function build($concrete) { if ($concrete instanceof Closure) { return $concrete($this); } $reflector = new ReflectionClass($concrete); if (!$reflector->isInstantiable()) { throw new Exception("Target [$concrete] is not instantiable."); } $constructor = $reflector->getConstructor(); if (is_null($constructor)) { return new $concrete; } $parameters = $constructor->getParameters(); $dependencies = $this->resolveDependencies($parameters); return $reflector->newInstanceArgs($dependencies); } protected function resolveDependencies($parameters) { $dependencies = []; foreach ($parameters as $parameter) { $dependency = $parameter->getClass(); if (is_null($dependency)) { $dependencies[] = $this->resolveNonClass($parameter); } else { $dependencies[] = $this->build($dependency->getName()); } } return $dependencies; } protected function resolveNonClass($parameter) { if ($parameter->isDefaultValueAvailable()) { return $parameter->getDefaultValue(); } throw new Exception('I have no idea what to do here.'); } protected function isShared($className) { return isset($this->instances[$className]) || (isset($this->bindings[$className]['shared']) && $this->bindings[$className]['shared'] === true); } public function __get($className) { return $this->make($className); }}class Test{ private $ioc; public function __construct($ioc) { $ioc->bind('show', function ($ioc) { return "Test --> show"; }); $this->ioc = $ioc; } public function show() { return $this->ioc->show; }}class Foo{ private $bim; public function __construct(Bim $bim) { $this->bim = $bim; }}class Bar{}class Bim{ private $bar; public function __construct(Bar $bar) { $this->bar = $bar; }}$Ioc = new Container();$Ioc->singleton('Foo');$bim = $Ioc->make('Foo');var_dump($bim);$Ioc->bind('Test', function ($ioc) { return new Test($ioc);});echo $Ioc->Test->show();
阅读全文
0 0
- 依赖注入,控制反转容器(ioc)
- 控制反转(依赖注入)IoC
- IOC控制反转(依赖注入思想)
- 栗子:控制反转(依赖注入)IOC
- IoC模式(控制反转、依赖注入)
- IoC模式(控制反转、依赖注入)
- 依赖注入(控制反转)IOC
- IOC控制反转(依赖注入思想)
- IOC(控制反转) DI(依赖注入)
- IOC控制反转(依赖注入)
- Spring Ioc(控制反转/依赖注入)
- 依赖注入&控制反转 IoC 容器和Dependency Injection 模式
- 依赖项注入 (DI) 和控制反转 (IOC) 容器模型
- Spring 控制反转(IoC)容器与依赖注入(DI)
- Spring容器的控制反转(IOC)和依赖注入(DI)
- 依赖注入 控制反转Ioc
- IoC模式(依赖、依赖倒置、依赖注入、控制反转)
- laravel服务容器-----深入理解控制反转(IoC)和依赖注入(DI)
- 对被忽视的数据安全威胁的仔细观察
- System.web.mvc 未能加载或是。。。
- Mariadb
- X-Window结构分析与应用
- 石子合并 动态规划(环形)
- 依赖注入,控制反转容器(ioc)
- 一条hang住数据库的SQL的分析
- 八.SpringBoot集成实例系列-持久化jpa
- 如何安装WindowsBuilder插件
- 高德地图Key添加之SHA1
- AJAX之利用时间戳解决缓存问题
- 使用Unity实现A*寻路算法
- Linux如何查看YUM的安装目录
- win10 安装VMware Workstation Pro 14出现无法连接 MKS: 套接字连接尝试次数太多;正在放弃.