PHP依赖倒置(Dependency Injection)代码实例


Posted in PHP onOctober 11, 2014

实现类:

<?php

 

class Container

{

    protected $setings = array();

 

    public function set($abstract, $concrete = null)

    {

        if ($concrete === null) {

            $concrete = $abstract;

        }

 

        $this->setings[$abstract] = $concrete;

    }

 

    public function get($abstract, $parameters = array())

    {

        if (!isset($this->setings[$abstract])) {

            return null;

        }

 

        return $this->build($this->setings[$abstract], $parameters);

    }

 

    public function build($concrete, $parameters)

    {

        if ($concrete instanceof Closure) {

            return $concrete($this, $parameters);

        }

 

        $reflector = new ReflectionClass($concrete);

 

        if (!$reflector->isInstantiable()) {

            throw new Exception("Class {$concrete} is not instantiable");

        }

 

        $constructor = $reflector->getConstructor();

 

        if (is_null($constructor)) {

            return $reflector->newInstance();

        }

 

        $parameters = $constructor->getParameters();

        $dependencies = $this->getDependencies($parameters);

 

        return $reflector->newInstanceArgs($dependencies);

    }

 

    public function getDependencies($parameters)

    {

        $dependencies = array();

        foreach ($parameters as $parameter) {

            $dependency = $parameter->getClass();

            if ($dependency === null) {

                if ($parameter->isDefaultValueAvailable()) {

                    $dependencies[] = $parameter->getDefaultValue();

                } else {

                    throw new Exception("Can not be resolve class dependency {$parameter->name}");

                }

            } else {

                $dependencies[] = $this->get($dependency->name);

            }

        }

 

        return $dependencies;

    }

}

实现实例:

<?php

 

require 'container.php';

 

 

interface MyInterface{}

class Foo implements MyInterface{}

class Bar implements MyInterface{}

class Baz

{

    public function __construct(MyInterface $foo)

    {

        $this->foo = $foo;

    }

}

 

$container = new Container();

$container->set('Baz', 'Baz');

$container->set('MyInterface', 'Foo');

$baz = $container->get('Baz');

print_r($baz);

$container->set('MyInterface', 'Bar');

$baz = $container->get('Baz');

print_r($baz);
PHP 相关文章推荐
强烈推荐:php.ini中文版(1)
Oct 09 PHP
GD输出汉字的函数的分析
Oct 09 PHP
按上下级层次关系输出内容的PHP代码
Jul 17 PHP
PHP中数字检测is_numeric与ctype_digit的区别介绍
Oct 04 PHP
ThinkPHP公共配置文件与各自项目中配置文件组合的方法
Nov 24 PHP
PHP开发框架laravel安装与配置教程
Mar 13 PHP
PHP统计数值数组中出现频率最多的10个数字的方法
Apr 20 PHP
php日期操作技巧小结
Jun 25 PHP
Yii2实现让关联字段支持搜索功能的方法
Aug 10 PHP
微信公众号模板消息群发php代码示例
Dec 29 PHP
PHP+Ajax实现的检测用户名功能简单示例
Feb 12 PHP
PHP实现的pdo连接数据库并插入数据功能简单示例
Mar 30 PHP
php实现设计模式中的单例模式详解
Oct 11 #PHP
PHP实现设计模式中的抽象工厂模式详解
Oct 11 #PHP
php中字符集转换iconv函数使用总结
Oct 11 #PHP
PHP生成网站桌面快捷方式代码分享
Oct 11 #PHP
PHP中执行cmd命令的方法
Oct 11 #PHP
PHP @ at 记号的作用示例介绍
Oct 10 #PHP
php json_encode()函数返回json数据实例代码
Oct 10 #PHP
You might like
php ignore_user_abort与register_shutdown_function 使用方法
2009/06/14 PHP
PHP __autoload函数(自动载入类文件)的使用方法
2012/02/04 PHP
php缓存技术详细总结
2013/08/07 PHP
php中并发读写文件冲突的解决方案
2013/10/25 PHP
PHP使用正则表达式清除超链接文本
2013/11/12 PHP
分享一则PHP定义函数代码
2015/02/26 PHP
详解PHP字符串替换str_replace()函数四种用法
2017/10/13 PHP
JQuery 构建客户/服务分离的链接模型中Table中的排序分析
2010/01/22 Javascript
Jquery中显示隐藏的实现代码分析
2011/07/26 Javascript
使用按钮控制以何种方式打开新窗口的属性介绍
2012/12/17 Javascript
jquery动态添加option示例
2013/12/30 Javascript
用js判断输入是否为中文的函数
2014/03/10 Javascript
js实现鼠标移到链接文字弹出一个提示层的方法
2015/05/11 Javascript
JQuery validate插件验证用户注册信息
2016/05/11 Javascript
浅谈js里面的InttoStr和StrtoInt
2016/06/14 Javascript
详解基于vue-cli配置移动端自适应
2018/01/13 Javascript
layui点击导航栏刷新tab页的示例代码
2018/08/14 Javascript
点击按钮弹出模态框的一系列操作代码实例
2019/03/29 Javascript
微信小程序官方动态自定义底部tabBar的例子
2019/09/04 Javascript
layui的布局和表格的渲染以及动态生成表格的方法
2019/09/18 Javascript
解决vue单页面应用进入页面加载所有 js 的问题
2020/08/12 Javascript
vue 公共列表选择组件,引用Vant-UI的样式方式
2020/11/02 Javascript
Python使用pickle模块报错EOFError Ran out of input的解决方法
2018/08/16 Python
python 定义类时,实现内部方法的互相调用
2019/12/25 Python
python 如何快速复制序列
2020/09/07 Python
利用Python pandas对Excel进行合并的方法示例
2020/11/04 Python
html5构建触屏网站之touch事件介绍
2013/01/07 HTML / CSS
欧缇丽英国官方网站:Caudalie英国
2016/08/17 全球购物
Redbubble法国:由独立艺术家设计的独特产品
2019/01/08 全球购物
俄罗斯园林植物网上商店:Garshinka
2020/07/16 全球购物
简述数组与指针的区别
2014/01/02 面试题
给面试官的感谢信
2014/02/01 职场文书
2016党员读书思廉心得体会
2016/01/23 职场文书
导游词之杭州岳王庙
2019/11/13 职场文书
pytorch 中nn.Dropout的使用说明
2021/05/20 Python
vue响应式原理与双向数据的深入解析
2021/06/04 Vue.js