通常,如何调用类中的方法:$class=newclass();$class->fun()依赖注入模式用于降低程序之间的耦合。依赖注入分为三种模式:setter方法注入重点是setter方法注入结合ArrayAccess/***ClassDi*@propertyPeople*/classDiimplementsArrayAccess{/***singleton*@varnull*/protectedstatic$实例=空;/***注册服务*@vararray*/protected$data=array();公共函数__construct(){echo'__construct'."\n";}publicfunctiononConstruct(){echo'onConstruct'."\n";}publicstaticfunctionone(){if(self::$instance==null){self::$instance=newDi();self::$instance->onConstruct();}返回自我::$实例;}publicfunctionget($name,$default=NULL){if(!empty($default)){return$default;}返回$this->data[$name];}publicfunctionset($name,$value){$this->data[$name]=$value;}公共函数__get($name){return$this->get($name);}公共函数__set($name,$value){$this->set($name,$value);}/**ArrayAccess数组访问接口**/publicfunctionoffsetSet($offset,$value){$this->set($offset,$value);}publicfunctionoffsetGet($offset){return$this->get($offset,NULL);}publicfunctionoffsetUnset($offset){unset($this->data[$offset]);}publicfunctionoffsetExists($offset){returnisset($this->data[$offset]);}}classPeople{protected$name='Test';公共函数getName(){返回$this->name;}}classEmail{publicfunctionsendEmail($email){return'邮件发送成功!';}}$di=Di::one();/**@vargetsetwaytoaccesspeople*/$di->people=newPeople();$people=$di->people;echo$di->people->getName();/**通过数组访问**/$di['Email']=newEmail();echo$di['Email']->sendEmail('33@qq.com');Phalapi也是这样实现依赖的Injection依赖注入相当于一个注册中心,通过魔术方法__set__get进行赋值和访问操作,$di->emailimplementsArrayAccess可以通过数组实现操作$di['Email']构造方法注入通过__construct访问类classa{公共功能测试(){回声“测试”;}}classc{受保护的$s;公共函数__construct($a){$this->s=$a;}publicfunctiontest(){$this->s->test();}}$a=newa();$c=newc($a);$c->test();接口注入接口sql{publicfunctionconnect();publicfunctionquery();}classmysqlimplementssql{publicfunctionconnect(){echo'连接mysql成功'。"\n";}publicfunctionquery(){//TODO:实现query()方法。}}classsqlServeimplementssql{publicfunctionconnect(){echo'连接到sqlServe成功'。"\n";}publicfunctionquery(){//TODO:实现query()方法。}}类演示{public$sql;公共函数__construct(sql$sql){$this->sql=$sql;}}$mysql=newmysql();$sqlServe=newsqlServe();(newDemo($mysql))->sql->connect();
