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 相关文章推荐
简单示例AJAX结合PHP代码实现登录效果代码
Jul 25 PHP
浅谈PHP强制类型转换,慎用!
Jun 06 PHP
php通过字符串调用函数示例
Mar 02 PHP
thinkphp验证码显示不出来的解决方法
Mar 29 PHP
php使用curl存储cookie的示例
Mar 31 PHP
PHP实现的memcache环形队列类实例
Jul 28 PHP
PHP实现递归无限级分类
Oct 22 PHP
PHP安装GeoIP扩展根据IP获取地理位置及计算距离的方法
Jul 01 PHP
phpStudy 2016 使用教程详解(支持PHP7)
Oct 18 PHP
PHP将英文数字转换为阿拉伯数字实例讲解
Jan 28 PHP
laravel使用Faker数据填充的实现方法
Apr 12 PHP
php web环境和命令行环境下查找php.ini的位置
Jul 17 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
全国FM电台频率大全 - 23 四川省
2020/03/11 无线电
CI框架入门示例之数据库取数据完整实现方法
2014/11/05 PHP
PHP中__set()实例用法和基础讲解
2019/07/23 PHP
PHP执行linux命令6个函数代码实例
2020/11/24 PHP
jQuery EasyUI NumberBox(数字框)的用法
2010/07/08 Javascript
in.js 一个轻量级的JavaScript颗粒化模块加载和依赖关系管理解决方案
2011/07/26 Javascript
javascript实现div的拖动并调整大小类似qq空间个性编辑模块
2012/12/12 Javascript
js复制到剪切板的实例方法
2013/06/28 Javascript
js图片自动轮播代码分享(js图片轮播)
2014/05/06 Javascript
JS+CSS实现简单的二级下拉导航菜单效果
2015/09/21 Javascript
以WordPress为例讲解jQuery美化页面Title的方法
2016/05/23 Javascript
如何在JS中实现相互转换XML和JSON
2016/07/19 Javascript
seajs学习之模块的依赖加载及模块API的导出
2016/10/20 Javascript
javascript iframe跨域详解
2016/10/26 Javascript
使用ionic播放轮询广告的实现方法(必看)
2017/04/24 Javascript
Jquery获取radio选中的值
2017/05/05 jQuery
将input框中输入内容显示在相应的div中【三种方法可选】
2017/05/08 Javascript
从零开始学习搭建React脚手架项目
2018/08/23 Javascript
jQuery实现购物车的总价计算和总价传值功能
2018/11/28 jQuery
原生JS实现弹幕效果的简单操作指南
2020/11/10 Javascript
详解Python在七牛云平台的应用(一)
2017/12/05 Python
Python实现的寻找前5个默尼森数算法示例
2018/03/25 Python
Python实现抓取HTML网页并以PDF文件形式保存的方法
2018/05/08 Python
python正向最大匹配分词和逆向最大匹配分词的实例
2018/11/14 Python
python控制nao机器人身体动作实例详解
2019/04/29 Python
ubuntu 18.04搭建python环境(pycharm+anaconda)
2019/06/14 Python
Django用户认证系统 User对象解析
2019/08/02 Python
python中如何使用insert函数
2020/01/09 Python
Python Opencv中用compareHist函数进行直方图比较对比图片
2020/04/07 Python
python matplotlib绘制三维图的示例
2020/09/24 Python
详解HTML5如何使用可选样式表为网站或应用添加黑暗模式
2020/04/07 HTML / CSS
.NET remoting中对象激活的两种方式
2015/06/08 面试题
营销与策划专业毕业生求职信
2013/11/01 职场文书
Django drf请求模块源码解析
2021/06/08 Python
CSS实现两列布局的N种方法
2021/08/02 HTML / CSS
「回转企鹅罐」10周年纪念展「輪るピングドラム展」海报公开
2022/03/22 日漫