php 依赖注入
2015-12-30 00:00
316 查看
摘要: php中的依赖注入传统的思路是应用程序在用到一个类的时候,就会创建这个类的对象并且调用方法。如果这个方法里面需要一个bar的类,那么就需要new一个bar的对象去进行调用。。。bar类中还需要调用bim的类,那么就还需要new一个bim的类去进行调用。
<?php// 代码【1】classBim{ publicfunctiondoSomething(){ echo__METHOD__, '|'; } }classBar{ publicfunctiondoSomething(){ $bim = new Bim(); $bim->doSomething(); echo__METHOD__, '|'; } }classFoo{ publicfunctiondoSomething(){ $bar = new Bar(); $bar->doSomething(); echo__METHOD__; } }$foo = new Foo();$foo->doSomething(); // Bim::doSomething|Bar::doSomething|Foo::doSomething使用依赖注入的思路是应用程序中用到foo类,foo类需要用bar类,bar类需要用到bim类。那么先创建bim类,在创建bar类,把bim类注入到bar中,然后创建foo类,将bar注入到foo中。
<?php// 代码【2】class Bim{ public function doSomething(){ echo __METHOD__, '|';}}class Bar{ private $bim; public function __construct(Bim $bim){ $this->bim = $bim;} public function doSomething(){ $this->bim->doSomething(); echo __METHOD__, '|';}}class Foo{ private $bar; public function __construct(Bar $bar){ $this->bar = $bar;} public function doSomething(){ $this->bar->doSomething(); echo __METHOD__;}}$foo = new Foo(new Bar(new Bim()));$foo->doSomething(); // Bim::doSomething|Bar::doSomething|Foo::doSomething以上代码说的就是控制反转模式。依赖关系的控制反转到调用链的起点。这样就可以完全空值依赖关系,通过调整不同注入对象来控制程序的行为。通过一个最简单的容器类来解释一下,这段代码来自 Twittee
<?phpclass Container{ private $s = array(); function __set($k, $c){ $this->s[$k] = $c;} function __get($k){ return $this->s[$k]($this);}}这段代码使用了魔术方法,在给不可访问属性赋值时,__set() 会被调用。读取不可访问属性的值时,__get() 会被调用。
<?php$c = new Container();$c->bim = function () { return new Bim();};$c->bar = function ($c) { return new Bar($c->bim);};$c->foo = function ($c) { return new Foo($c->bar);};// 从容器中取得Foo$foo = $c->foo;$foo->doSomething(); // Bim::doSomething|Bar::doSomething|Foo::doSomething这段代码使用了匿名函数再来一段简单的代码演示一下,容器代码来自simple di container
<?phpclass IoC{ protected static $registry = []; public static function bind($name, Callable $resolver){ static::$registry[$name] = $resolver;} public static function make($name){ if (isset(static::$registry[$name])) { $resolver = static::$registry[$name]; return $resolver();} throw new Exception('Alias does not exist in the IoC registry.');}}IoC::bind('bim', function () { return new Bim();});IoC::bind('bar', function () { return new Bar(IoC::make('bim'));});IoC::bind('foo', function () { return new Foo(IoC::make('bar'));});// 从容器中取得Foo$foo = IoC::make('foo');$foo->doSomething(); // Bim::doSomething|Bar::doSomething|Foo::doSomething这段代码使用了后期静态绑定
依赖注入容器 (dependency injection container) 高级功能
真实的dependency injection container会提供更多的特性,如自动绑定(Autowiring)或 自动解析(Automatic Resolution)注释解析器(Annotations)延迟注入(Lazy injection)不过说实话 这些东西 没写过。。要写过才知道相关文章推荐
- 某些CTF密码算法的PHP解法
- 2. PHP-FIG
- php与Microsoft SQL Server
- win8X64下自行搭建PHP开发环境
- PHP通过邮件发送附件
- PHP字符串拆分函数之mb_substr
- 查找php配置文件php.ini所在路径的二种方法
- PHP单双引号的关系与区别
- Liunx 环境下vsftpd的三种实现方法(超详细参数)
- WindowManager.LayoutParams 的各种属性
- CCNP学习笔记16-MSTP,span
- PHP的MySQL扩展:PHP訪问MySQL的经常使用扩展函数
- PHP 连接打开新网页带参数
- windows下用sendmail配置php的mail函数
- espcms /public/class_connector.php intval truncation Vul Arbitrary User Login
- php学习02--常量与变量
- PHP中的set_time_limit,max_execution_time,sleep
- PHP命名空间
- phpcms V9 安装黄页模块后,注册为普通会员并登录,点立即免费入驻企业库出现白板
- Phpstorm常用设置