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 相关文章推荐
在windows iis5下安装php4.0+mysql之我见
Oct 09 PHP
Smarty模板快速入门
Jan 04 PHP
Linux fgetcsv取得的数组元素为空字符串的解决方法
Nov 25 PHP
解析php5配置使用pdo
Jul 03 PHP
php检测用户是否用手机(Mobile)访问网站的类
Jan 09 PHP
php多重接口的实现方法
Jun 20 PHP
详解js异步文件加载器
Jan 24 PHP
php微信公众账号开发之前五个坑(一)
Sep 18 PHP
Symfony查询方法实例小结
Jun 28 PHP
PHP下 Mongodb 连接远程数据库的实例代码
Aug 30 PHP
php实现的生成迷宫与迷宫寻址算法完整实例
Nov 06 PHP
PHP文件类型检查及fileinfo模块安装使用详解
May 09 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环境配置 php5 MySQL5 apache2 phpmyadmin安装与配置图文教程
2007/03/16 PHP
PHP与SQL注入攻击[二]
2007/04/17 PHP
PHP的异常处理类Exception的使用及说明
2012/06/13 PHP
PHP数组无限分级数据的层级化处理代码
2012/12/29 PHP
PHP入门经历和学习过程分享
2014/04/11 PHP
php中用memcached实现页面防刷新功能
2014/08/19 PHP
Codeigniter购物车类不能添加中文的解决方法
2014/11/29 PHP
php文件上传后端处理小技巧
2016/05/22 PHP
基于thinkPHP框架实现留言板的方法
2016/10/17 PHP
php的RSA加密解密算法原理与用法分析
2020/01/23 PHP
javascript学习笔记之10个原生技巧
2014/05/21 Javascript
DOM节点深度克隆函数cloneNode()用法实例
2015/01/12 Javascript
jQuery实现带动画效果的多级下拉菜单代码
2015/09/08 Javascript
浅谈javascript中的数据类型转换
2016/12/27 Javascript
JavaScript设置名字输入不合法的实现方法
2017/05/23 Javascript
vue elementUI tree树形控件获取父节点ID的实例
2018/09/12 Javascript
基于vue-cli3和element实现登陆页面
2019/11/13 Javascript
vue中 v-for循环的用法详解
2020/02/19 Javascript
利用Python批量生成任意尺寸的图片
2016/08/29 Python
python实现下载pop3邮件保存到本地
2018/06/19 Python
python制作抖音代码舞
2019/04/07 Python
python对象转字典的两种实现方式示例
2019/11/07 Python
python cv2读取rtsp实时码流按时生成连续视频文件方式
2019/12/25 Python
pytorch 实现将自己的图片数据处理成可以训练的图片类型
2020/01/08 Python
python列表的逆序遍历实现
2020/04/20 Python
Python Pandas list列表数据列拆分成多行的方法实现
2020/12/14 Python
Pytorch实现WGAN用于动漫头像生成
2021/03/04 Python
经济实惠的豪华家具:My-Furniture
2019/03/12 全球购物
Etam俄罗斯:法国女士内衣和家居服网上商店
2019/10/30 全球购物
幼儿园数学教学反思
2014/02/02 职场文书
公司会计主管岗位责任制
2014/03/01 职场文书
经济贸易系毕业生求职信
2014/05/31 职场文书
办理房产证委托书
2014/09/18 职场文书
先进集体申报材料
2014/12/25 职场文书
幼儿园综治宣传月活动总结
2015/05/07 职场文书
MySQL创建高性能索引的全步骤
2021/05/02 MySQL