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系统流量分析的程序
Oct 09 PHP
坏狼的PHP学习教程之第1天
Jun 15 PHP
php 将字符串按大写字母分隔成字符串数组
Apr 30 PHP
php目录操作函数之获取目录与文件的类型
Dec 29 PHP
解析Extjs与php数据交互(增删查改)
Jun 25 PHP
如何解决CI框架的Disallowed Key Characters错误提示
Jul 05 PHP
使用PHP和HTML5 FormData实现无刷新文件上传教程
Sep 06 PHP
php中删除数组的第一个元素和最后一个元素的函数
Mar 07 PHP
php实现的简单日志写入函数
Mar 31 PHP
php基础教程
Aug 26 PHP
php支持断点续传、分块下载的类
May 02 PHP
PHP htmlspecialchars_decode()函数用法讲解
Mar 01 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 IF ELSE简化/三元一次式的使用
2011/08/22 PHP
PHP的压缩函数实现:gzencode、gzdeflate和gzcompress的区别
2016/01/27 PHP
PHP结合Mysql数据库实现留言板功能
2016/03/04 PHP
PHP使用new StdClass()创建空对象的方法分析
2017/06/06 PHP
DD_belatedPNG,IE6下PNG透明解决方案(国外)
2010/12/06 Javascript
写自已的js类库需要的核心代码
2012/07/16 Javascript
js实现点击添加一个input节点
2014/12/05 Javascript
Node.js的包详细介绍
2015/01/14 Javascript
基于javascript实现表格的简单操作
2016/05/21 Javascript
使用JavaScript实现弹出层效果的简单实例
2016/05/31 Javascript
浅谈JavaScript函数的四种存在形态
2016/06/08 Javascript
JS中Json数据的处理和解析JSON数据的方法详解
2016/06/29 Javascript
Vue.js一个文件对应一个组件实践
2016/10/27 Javascript
使用JavaScript触发过渡效果的方法
2017/01/19 Javascript
JavaScript字符集编码与解码详谈
2017/02/02 Javascript
js/jq仿window文件夹框选操作插件
2017/03/08 Javascript
jQuery+ajax实现局部刷新的两种方法
2017/06/08 jQuery
node.js-v6新版安装具体步骤(分享)
2017/09/06 Javascript
element form 校验数组每一项实例代码
2019/10/10 Javascript
[03:28]2014DOTA2国际邀请赛 走近EG战队天才中单Arteezy
2014/07/12 DOTA
python3.5使用tkinter制作记事本
2016/06/20 Python
python读取文本中数据并转化为DataFrame的实例
2018/04/10 Python
Sanic框架蓝图用法实例分析
2018/07/17 Python
Python异步操作MySQL示例【使用aiomysql】
2019/05/16 Python
Python实现http接口自动化测试的示例代码
2020/10/09 Python
HTML5新增元素如何兼容旧浏览器有哪些方法
2014/05/09 HTML / CSS
受外贸欢迎的美国主机:BlueHost
2017/05/16 全球购物
交通事故检查书范文
2014/01/30 职场文书
办公自动化专业大学生职业规划书
2014/03/06 职场文书
大学生就业策划书范文
2014/04/04 职场文书
大学竞选班长演讲稿
2014/04/24 职场文书
集中整治工作方案
2014/05/01 职场文书
2015年世界卫生日活动总结
2015/02/09 职场文书
办公室禁烟通知
2015/04/23 职场文书
九年级历史教学反思
2016/02/19 职场文书
高考满分作文赏析(2篇)
2019/08/12 职场文书