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 相关文章推荐
关于更改Zend Studio/Eclipse代码风格主题的介绍
Jun 23 PHP
php实现图形显示Ip地址的代码及注释
Jan 20 PHP
php中利用explode函数分割字符串到数组
Feb 08 PHP
PHP 函数call_user_func和call_user_func_array用法详解
Mar 02 PHP
php实现分页显示
Nov 03 PHP
php简单实现文件或图片强制下载的方法
Dec 06 PHP
PHP API接口必备之输出json格式数据示例代码
Jun 27 PHP
php插件Xajax使用方法详解
Aug 31 PHP
PHP时间处理类操作示例
Sep 05 PHP
PHP实现的支付宝支付功能示例
Mar 26 PHP
微信公众平台开发教程④ ThinkPHP框架下微信支付功能图文详解
Apr 10 PHP
PHP进阶学习之垃圾回收机制详解
Jun 18 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 错误之引号中使用变量
2009/05/04 PHP
php数组转换js数组操作及json_encode的用法详解
2013/10/26 PHP
PHP set_error_handler()函数使用详解(示例)
2013/11/12 PHP
php将mysql数据库整库导出生成sql文件的具体实现
2014/01/08 PHP
PHP ignore_user_abort函数详细介绍和使用实例
2014/07/15 PHP
PHP中cookie和session的区别实例分析
2014/08/28 PHP
Yii 快速,安全,专业的PHP框架
2014/09/03 PHP
php使用COPY函数更新配置文件的方法
2015/06/18 PHP
PHP实现根据时间戳获取周几的方法
2016/02/26 PHP
php bootstrap实现简单登录
2016/03/08 PHP
jQuery取id有.的值的方法
2014/05/21 Javascript
兼容主流浏览器的JS复制内容到剪贴板
2014/12/12 Javascript
基于Bootstrap里面的Button dropdown打造自定义select
2016/05/30 Javascript
angular ngClick阻止冒泡使用默认行为的方法
2016/11/03 Javascript
详解JavaScript 中getElementsByName在IE中的注意事项
2017/02/21 Javascript
JS检测是否可以访问公网服务器功能代码
2017/06/19 Javascript
vue组件之间通信方式实例总结【8种方式】
2019/02/22 Javascript
基于vue-cli3创建libs库的实现方法
2019/12/04 Javascript
Python编码类型转换方法详解
2016/07/01 Python
Python读csv文件去掉一列后再写入新的文件实例
2017/12/28 Python
使用50行Python代码从零开始实现一个AI平衡小游戏
2018/11/21 Python
浅谈python的深浅拷贝以及fromkeys的用法
2019/03/08 Python
Django框架模型简单介绍与使用分析
2019/07/18 Python
聊聊Python pandas 中loc函数的使用,及跟iloc的区别说明
2021/03/03 Python
CSS实现鼠标滑过鼠标点击代码写法
2016/12/26 HTML / CSS
HTML5中的Scoped属性使用实例
2014/04/23 HTML / CSS
中医专业应届生求职信
2013/11/17 职场文书
给老婆大人的检讨书
2014/02/24 职场文书
党务公开方案
2014/05/06 职场文书
2015年信访维稳工作总结
2015/04/07 职场文书
2015年节能减排工作总结
2015/05/14 职场文书
安娜卡列尼娜观后感
2015/06/11 职场文书
Python中快速掌握Data Frame的常用操作
2021/03/31 Python
redis 限制内存使用大小的实现
2021/05/08 Redis
JavaScript中isPrototypeOf函数
2021/11/07 Javascript
python自动化测试之Selenium详解
2022/03/13 Python