看Laravel源码了解ContainerDependencyInjectionContainers的基本功能:进程对象本身从Container管理对象的实例化到配置都不知道是什么由容器管理,对容器一无所知。这就是Container能够管理任何PHP对象的原因。使用DI管理依赖项的对象很棒,但不是必需的。ilogger=$logger;}publicfunctionshow(){$user='小灰灰';$this->logger->execute($user);}}$useLogger=newUseLogger(newLogToFile());$useLogger->show();iiAlogger=$logger;}publicfunctionshow(){$user='小灰灰';$this->logger->execute($user);}}$useLogger=newUseLogger(newLogToFile());$useLogger->show();Blogger=$logger;}publicfunctionshow(){$user='小灰灰';$this->logger->execute($user);}}$useLogger=newUseLogger(newLogToDD());$useLogger->show();iiilogger=$logger;}publicfunctionshow(){$user='小灰灰';$this->logger->execute($user);}}$useLogger=newUseLogger(newLogToFile());$useLogger->show();echo'
';$useLogger=newUseLogger(newLogToDD());$useLogger->show();最终版logger=$logger;}publicfunctionshow(){$user='小灰灰';$this->logger->execute($user);}}classSimpleContainer{//使用存储所有绑定key-valueprotectedstatic$container=[];publicstaticfunctionbind($name,Callable$resolver){static::$container[$name]=$resolver;}publicstaticfunctionmake($name){if(isset(static::$container[$name])){$resolver=static::$container[$name];返回$解析器();}thrownewException("容器中不存在绑定");}}SimpleContainer::bind(Logger::class,function(){returnnewLogToDD();});$useLogger3=newUseLogger(SimpleContainer::make(Logger::class));$useLogger3->show();示例module=$module;}publicfunctionshow(array$target){$this->module->activate($target);}}classPowerA实现SuperModuleInterface{publicfunctionactivate(array$target){echo'
'.__方法__;print_r(func_get_args());}}classPowerB实现SuperModuleInterface{publicfunctionactivate(array$target){echo''.__方法__;print_r(func_get_args());}}classContainer{protected$binds;受保护的实例;/***@param$abstract*@param$concrete*把代词绑定到容器里,为后续make*/publicfunctionbind($abstract,$concrete){if($concreteinstanceofClosure){$this->绑定[$抽象]=$具体;}else{$this->instances[$abstract]=$concrete;}}/***@param$abstract*@paramarray$parameters*@returnmixed*创建对象*/publicfunctionmake($abstract,$parameters=[]){如果(isset($this->instances[$abstract])){return$this->instances[$abstract];}//把容器对象$this,放入参数数组的第一个元素对call_user_func_array使用array_unshift($parameters,$this);//这里$this->binds[$abstract]绑定了闭包函数,执行函数参数为$parametersreturncall_user_func_array($this->binds[$abstract],$parameters);}}//创建容器(以下简称超级工厂)$container=newContainer;//将超级电源模块的生产脚本添加到超级工厂$container->bind('powerA',function($container){returnnewPowerA;});//同上$container->bind('powerB',function($container){returnnewPowerB;});//将超人的生产脚本添加到超级工厂$container->bind('superman',function($container,$moduleName){returnnewSuperman($container->make($moduleName));});echo"";//开始生产$superman_1=$container->make('superman',['powerA']);$superman_1->show(['a'=>1]);$superman_2=$container->make('superman',['powerB']);$superman_2->show(['b'=>1]);