phalcon的php版本依赖注入容器环境需要php7.0+安装composerrequirefanqingxuan/di如果想安装扩展版php的容器可以参考todi-ext,usage基本用法和这个require_once'vendor/autoload.php';useJsonDi\Di;classTest{}$di=newDi;//注入方式完全一样$di->set('test','Test');$di->set("test2",function(){returnnewTest;});$di->set("test3",Test::class);$di->set('test4',新测试);如您所见,有几种方法可以注入容器字符串$di->set('test','Test');$di->set("test3",Test::class);实例对象$di->set('test5',newTest);闭包/匿名函数$di->set("test2",function(){returnnewTest;});您还可以将其他参数传递给匿名函数require_once'vendor/autoload.php';useJsonDi\Di;useJsonDi\Config;$di=newDi;$di->set('config',newConfig(['database'=>['host'=>'localhost','username'=>'root','password'=>'111111']]));classMysqlDb{publicfunction__construct($config){print_r($配置);}}$di->set('db',function(){returnnewMysqlDb($this->get('config')->database);//从容器中获取数据库配置});也可以使用use关键字实现$config=['host'=>'localhost','username'=>'root','password'=>'111111'];$di->set('db',function()使用($config){returnnewMysqlDb($config);});高级用法构造函数注入这种注入类型可以将参数注入到构造函数类UserService{protected$userDao;受保护的$userType;公共函数__construct(UserDao$userDao,$userType){$this->userDao=$userDao;$this->userType=$userType;}}注入$di->set('userDao',['className'=>UserDao::class]);$di->set('userService',['className'=>UserService::class,'arguments'=>[['type'=>'service','name'=>'userDao',//另一个服务容器中的名称],['type'=>'参数','值'=>3]]]);setter注入类UserService{protected$userDao;受保护的$userType;公共功能setUserDao(UserDao$userDao){$this->userDao=$userDao;}publicfunctionsetUserType($userType){$this->userType=$userType;}}通过以下方式将参数注入setter$di->set('userService',['className'=>'UserService','calls'=>[['method'=>'setUserDao','arguments'=>[['type'=>'service','name'=>'userDao',]]],['method'=>'setUserType','arguments'=>[['type'=>'参数','value'=>3]]]]]);属性注册给public的属性注册参数classUserService{public$userDao;公共$用户类型;public$tempObj;}$di->set('userService',['className'=>UserService::class,'properties'=>[['name'=>'userDao','value'=>['type'=>'service','name'=>'userDao',//容器中的服务名]],['name'=>'userType','value'=>['type'=>'parameter','value'=>2,]],['name'=>'tempObj','value'=>['type'=>'instance','className'=>'StdClass','arguments'=>[]]]]]);更高级的用法通过下面的php文件注入//service.php['className'=>Test::class,'shared'=>true,],];注入require_once'vendor/autoload.php';使用Json/配置;$di=新Di;$di->loadFromPhp('service.php');数组注入上面我们介绍了使用set函数注入的方法,其实也可以使用数组key-value注入$di['db']=newStdClass;$di['db']=function(){returnnewStdClass;}$di['db']='StdClass';$di['db']=['className'=>'StdClass']属性注入可以使用实例属性注入,本质上是容器实现__set,__get魔术方法$di->db=newStdClass;$di->db=function(){returnnewStdClass;}$di->db=StdClass::class;$di->db=['className'=>'stdClass'];获取服务获取方法$di->get('db');魔术方法$di->getDb();数组键$di['db'];实例属性$di->db;singletonservice服务可以以单例模式注入到容器中,也就是说在执行过程中同一个服务只有一个实例$di->setShared('db',function(){returnnewMysqlDb();});也可以使用set方法将第三个参数设置为true$di->set('db',function(){returnnewMysqlDb();},true);修改容器中的服务服务注入容器后,还可以修改classTest{}//注册服务$di->set('test','StdClass');//获取服务$test=$di->getService('test');//改变定义$test->setDefinition(function(){returnnewTest;});//解析服务$test->resolve();将容器注入服务容器用于将其他服务注入容器,但有时需要将容器注入服务,让服务通过容器访问容器中的所有服务,实现解耦为此,您需要将您的服务从JsonDi\Di\AbstractInjectionAware类继承到require_once'vendor/autoload.php';useJsonDi\Di;useJsonDi\Di\AbstractInjectionAware;classMysql{publicfunctionselect(){return“这是选择”;}}classHomeControllerextendsAbstractInjectionAware{publicfunctionsay(){echo$this->container->get('db')->select();}}$di=新Di;$di->set('db',Mysql::class);$di->set('home',HomeController::class);$di->get('home')->say();服务提供者使用JsonDi\Di\ServiceProviderInterface接口,您可以将您的注入容器代码写入注册方法。require_once'vendor/autoload.php';使用JsonDi\Di\DiInterface;使用JsonDi\Di\ServiceProviderInterface;classSessionServiceProvider实现ServiceProviderInterface{publicfunctionregister(DiInterface$di):void{$di->set('session','会话类');}}$di->register(newSessionServiceProvider());$di->get('session');
