多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
https://www.cnblogs.com/liangphp/p/12018993.html 小亮最近在翻thinkphp和laravel手册,发现其中大量使用容器概念。那么什么是容器呢?字面意思理解为装东西的器皿。那么装的是什么呢?装的是类实例化的对象。为什么要这么做呢?第一点使用对象方便,第二点解耦。下面一个例子简单的贯穿了框架中使用的容器服务,其中涉及一些知识如依赖注入、函数闭包(Closure)、匿名函数、回调函数call\_user\_func\_array、控制反转(Ioc)等等。留着自己复习,也供大家参考。 [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") ~~~ <?php //创建一个类 class Shenyang { private $area;//地区 public function __construct(IArea $area) { $this->area=$area; $this->area->myarea(); } } //定义地区接口,来实现多态。方便实例化各个地区 interface IArea { public function myarea(); } class Huanggu implements IArea { public function myarea() { echo "我是皇姑区"; } } class Shenhe implements IArea { public function myarea() { echo "我是沈河区"; } } class Container { public $bind=[];//绑定实例名 public $instance=[];//实例数组 //绑定方法,第一个参数是实例名,第二个参数是个闭包 public function bind($abstract,$closure) { if($closure instanceof Closure){ $this->bind[$abstract]=$closure; }else{ $this->instance[$abstract]=$closure; } } //从容器中取出实例,第一个参数是实例名,第二参数是实例依赖的对象 public function make($abstract,$parameters=[]) { if(isset($this->instance[$abstract])){ return $this->instance[$abstract]; }else{ //将容器对象带走 array_unshift($parameters,$this); //执行闭包 return call_user_func_array($this->bind[$abstract],$parameters); } } } //实例化容器 $container=new Container(); //将类绑定 $container->bind('huanggu',function (){return new Huanggu();}); //将类绑定的同时,通过构造方法依赖注入 $container->bind('shenyang',function ($container,$module){ return new Shenyang($container->make($module)); }); //从容器中取出 $container->make('shenyang',['huanggu']); ~~~ [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") ThinkPHP容器之初步解析 https://www.php.cn/phpkj/thinkphp/461075.html