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写的serv-u的web申请账号的程序
Oct 09 PHP
PHP 字符串编码截取函数(兼容utf-8和gb2312)
May 02 PHP
PHP中CURL方法curl_setopt()函数的参数分享
Jan 19 PHP
在smarty中调用php内置函数的方法
Feb 07 PHP
比较简单的百度网盘文件直链PHP代码
Mar 24 PHP
测试php函数的方法
Nov 13 PHP
PHP程序漏洞产生的原因分析与防范方法说明
Mar 06 PHP
PHP使用flock实现文件加锁的方法
Jul 01 PHP
php微信公众平台开发之获取用户基本信息
Aug 17 PHP
js基于qrcode.js生成二维码的方法【附demo插件源码下载】
Dec 28 PHP
php 删除一维数组中某一个值元素的操作方法
Feb 01 PHP
Linux下 php7安装redis的方法
Nov 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的error_reporting错误级别变量对照表
2014/07/08 PHP
yii去掉必填项中星号的方法
2015/12/28 PHP
Yii框架布局文件的动态切换操作示例
2019/11/11 PHP
检测input每次的输入是否合法遇到汉字输入就有问题
2012/05/23 Javascript
JavaScript实现快速排序(自已编写)
2012/12/19 Javascript
JQuery实现简单验证码提示解决方案
2012/12/20 Javascript
JavaScript的模块化:封装(闭包),继承(原型) 介绍
2013/07/22 Javascript
javascript判断两个IP地址是否在同一个网段的实现思路
2013/12/13 Javascript
深入浅析JavaScript中的constructor
2016/04/19 Javascript
使用base64对图片的二进制进行编码并用ajax进行显示
2017/01/03 Javascript
简单的渐变轮播插件
2017/01/12 Javascript
jQuery为某个div加入行样式
2017/06/09 jQuery
微信小程序实现文字跑马灯效果
2020/05/26 Javascript
Vue.js 十五分钟入门图文教程
2018/09/12 Javascript
微信小程序页面间传值与页面取值操作实例分析
2019/04/30 Javascript
微信小程序代码上传、审核发布小程序
2019/05/18 Javascript
JS实现点击生成UUID的方法完整实例【基于jQuery】
2019/06/12 jQuery
bootstrap 日期控件 datepicker被弹出框dialog覆盖的解决办法
2019/07/09 Javascript
vue 出现data-v-xxx的原因及解决
2020/08/04 Javascript
Python脚本实现网卡流量监控
2015/02/14 Python
Python实现拷贝多个文件到同一目录的方法
2016/09/19 Python
pyinstaller参数介绍以及总结详解
2019/07/12 Python
pymysql的简单封装代码实例
2020/01/08 Python
Pytorch释放显存占用方式
2020/01/13 Python
浅谈Python的方法解析顺序(MRO)
2020/03/05 Python
keras 自定义loss损失函数,sample在loss上的加权和metric详解
2020/05/23 Python
DataFrame.groupby()所见的各种用法详解
2020/06/14 Python
python爬虫请求头设置代码
2020/07/28 Python
小学社会实践活动总结
2014/07/03 职场文书
先进员工获奖感言
2014/08/14 职场文书
四风对照检查材料范文
2014/09/27 职场文书
2014年人事工作总结范文
2014/11/19 职场文书
2015年毕业生自荐信范文
2015/03/24 职场文书
三十年同学聚会致辞
2015/07/28 职场文书
小学生红领巾广播稿
2015/08/19 职场文书
在CSS中映射鼠标位置并实现通过鼠标移动控制页面元素效果(实例代码)
2021/04/22 HTML / CSS