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和ACCESS写聊天室(九)
Oct 09 PHP
自己在做项目过程中学到的PHP知识收集
Aug 20 PHP
如何使用php判断服务器是否是HTTPS连接
Jul 05 PHP
PHP弹出提示框并跳转到新页面即重定向到新页面
Jan 24 PHP
删除html标签得到纯文本可处理嵌套的标签
Apr 28 PHP
php之static静态属性与静态方法实例分析
Jul 30 PHP
解析WordPress中函数钩子hook的作用及基本用法
Dec 22 PHP
详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
Apr 07 PHP
Laravel实现表单提交
May 07 PHP
Yii 2.0在Grid中格式化时间方法示例
Jun 06 PHP
PHP中抽象类,接口功能、定义方法示例
Feb 26 PHP
基于PHP实现堆排序原理及实例详解
Jun 19 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
一个基于PDO的数据库操作类(新) 一个PDO事务实例
2011/07/03 PHP
PHP中addcslashes与stripcslashes函数用法分析
2016/01/07 PHP
thinkPHP框架实现的无限回复评论功能示例
2018/06/09 PHP
PHP7 新增功能
2021/03/09 PHP
JQuery 浮动导航栏实现代码
2009/08/27 Javascript
jQuery AJAX timeout 超时问题详解
2016/06/21 Javascript
BootStrap实现响应式布局导航栏折叠隐藏效果(在小屏幕、手机屏幕浏览时自动折叠隐藏)
2016/11/30 Javascript
基于jQuery实现的幻灯图片切换
2016/12/02 Javascript
超简单的Vue.js环境搭建教程
2017/03/17 Javascript
Underscore之Array_动力节点Java学院整理
2017/07/10 Javascript
详解React Native顶|底部导航使用小技巧
2017/09/14 Javascript
element-ui中select组件绑定值改变,触发change事件方法
2018/08/24 Javascript
Vue+Express实现登录注销功能的实例代码
2019/05/05 Javascript
解决layer.open弹出框不能获取input框的值为空的问题
2019/09/10 Javascript
vue请求数据的三种方式
2020/03/04 Javascript
[24:42]VP vs TNC Supermajor小组赛B组 BO3 第三场 6.2
2018/06/03 DOTA
python去掉空白行的多种实现代码
2018/03/19 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
2019/01/26 Python
Python如何省略括号方法详解
2020/03/21 Python
Python基于pip实现离线打包过程详解
2020/05/15 Python
解决python便携版无法直接运行py文件的问题
2020/09/01 Python
基于Python爬取京东双十一商品价格曲线
2020/10/23 Python
如何用Python提取10000份log中的产品信息
2021/01/14 Python
Supersmart英国:欧洲市场首批食品补充剂供应商之一
2018/05/05 全球购物
巴西最好的男鞋:Rafarillo
2018/05/25 全球购物
编辑硕士自荐信范文
2013/11/27 职场文书
银行竞聘演讲稿
2014/05/16 职场文书
中华美德颂演讲稿
2014/05/20 职场文书
十八大演讲稿
2014/05/22 职场文书
新闻传播专业求职信
2014/07/22 职场文书
2014年法务工作总结
2014/12/11 职场文书
行政复议答复书
2015/07/01 职场文书
音乐课《小猫钓鱼》教学反思
2016/02/18 职场文书
祝福语集锦:给满月宝宝的祝福语
2019/11/20 职场文书
pytorch 梯度NAN异常值的解决方案
2021/06/05 Python
springboot使用Redis作缓存使用入门教程
2021/07/25 Redis