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 相关文章推荐
通过文字传递创建的图形按钮
Oct 09 PHP
PHP定时自动生成静态HTML的实现代码
Jun 20 PHP
PHP+ACCESS 文章管理程序代码
Jun 21 PHP
PHP面向对象分析设计的61条军规小结
Jul 17 PHP
深入理解PHP原理之错误抑制与内嵌HTML分析
May 02 PHP
php获取文件内容最后一行示例
Jan 09 PHP
php实现保存submit内容之后禁止刷新
Mar 19 PHP
PHP中date与gmdate的区别及默认时区设置
May 12 PHP
PHP 常用的header头部定义汇总
Jun 19 PHP
PHP面向对象编程之深入理解方法重载与方法覆盖(多态)
Dec 24 PHP
Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
Oct 11 PHP
php ActiveMQ的安装与使用方法图文教程
Feb 23 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取出数组单个值的方法
2018/03/12 PHP
PHP实现的获取文件mimes类型工具类示例
2018/04/08 PHP
Use Word to Search for Files
2007/06/15 Javascript
灵活应用js调试技巧解决样式问题的步骤分享
2012/03/15 Javascript
用Jquery实现滚动新闻
2014/02/12 Javascript
javascript的document.referrer浏览器支持、失效情况总结
2014/07/18 Javascript
js简单网速测试方法完整实例
2015/12/15 Javascript
Function.prototype.apply()与Function.prototype.call()小结
2016/04/27 Javascript
jQuery中实现prop()函数控制多选框(全选,反选)
2016/08/19 Javascript
Javascript 数组去重的方法(四种)详解及实例代码
2016/11/24 Javascript
详解RequireJS按需加载样式文件
2017/04/12 Javascript
设置cookie指定时间失效(实例代码)
2017/05/28 Javascript
jQuery选取所有复选框被选中的值并用Ajax异步提交数据的实例
2017/08/04 jQuery
vue源码入口文件分析(推荐)
2018/01/30 Javascript
React Native基础入门之初步使用Flexbox布局
2018/07/02 Javascript
Jquery遍历筛选数组的几种方法和遍历解析json对象,Map()方法详解以及数组中查询某值是否存在
2019/01/18 jQuery
使用Webpack 搭建 Vue3 开发环境过程详解
2020/07/28 Javascript
jquery实现点击左右按钮切换图片
2021/01/27 jQuery
[03:14]辉夜杯主赛事 12月25日每日之星
2015/12/26 DOTA
Python Flask-web表单使用详解
2017/11/18 Python
Python基于hashlib模块的文件MD5一致性加密验证示例
2018/02/10 Python
使用python和pygame制作挡板弹球游戏
2019/12/03 Python
详解查看Python解释器路径的两种方式
2020/10/15 Python
HTML5 声明兼容IE的写法
2011/05/16 HTML / CSS
美国高级音响品牌:Master&Dynamic
2018/07/05 全球购物
英国计算机商店:Technextday
2019/12/28 全球购物
面向对象编程OOP的优点
2013/01/22 面试题
入党申请书自我鉴定
2013/10/12 职场文书
计算机网络工程专业职业生涯规划书
2014/03/10 职场文书
《画风》教学反思
2014/04/16 职场文书
社区健康教育工作方案
2014/06/03 职场文书
乡镇群众路线专项整治方案
2014/11/03 职场文书
《珍珠鸟》教学反思
2016/02/16 职场文书
css display table 自适应高度、宽度问题的解决
2021/05/07 HTML / CSS
vue-cropper插件实现图片截取上传组件封装
2021/05/27 Vue.js
JavaScript offset实现鼠标坐标获取和窗口内模块拖动
2021/05/30 Javascript