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 adodb连接不同数据库
Mar 19 PHP
创建数据库php代码 用PHP写出自己的BLOG系统
Apr 12 PHP
php在文件指定行中写入代码的方法
May 23 PHP
PHP中strlen()和mb_strlen()的区别浅析
Jun 19 PHP
ThinkPHP权限认证Auth实例详解
Jul 22 PHP
php画图实例
Nov 05 PHP
php简单socket服务器客户端代码实例
May 18 PHP
php文件读取方法实例分析
Jun 20 PHP
大家在抢红包,程序员在研究红包算法
Aug 31 PHP
CI框架中redis缓存相关操作文件示例代码
May 17 PHP
PHPCMS2008广告模板SQL注入漏洞修复
Oct 11 PHP
Ajax中的JSON格式与php传输过程全面解析
Nov 14 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 Rename 更改文件、文件夹名称
2011/05/24 PHP
Zend Framework框架实现类似Google搜索分页效果
2016/11/25 PHP
PHP实现将标点符号正则替换为空格的方法
2017/08/09 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
jQuery 点击图片跳转上一张或下一张功能的实现代码
2010/03/12 Javascript
php上传图片并给图片打上透明水印的代码
2010/06/07 Javascript
来自国外的30个基于jquery的Web下拉菜单
2012/06/22 Javascript
js模仿html5 placeholder适应于不支持的浏览器
2013/01/13 Javascript
jquery判断元素是否隐藏的多种方法
2014/05/06 Javascript
jQery使网页在显示器上居中显示适用于任何分辨率
2014/06/09 Javascript
js实时获取并显示当前时间的方法
2015/07/31 Javascript
jQuery计算文本框字数及限制文本框字数的方法
2016/03/01 Javascript
Ext JS动态加载JavaScript创建窗体的方法
2016/06/23 Javascript
微信JSAPI支付操作需要注意的细节
2017/01/10 Javascript
微信小程序page的生命周期和音频播放及监听实例详解
2017/04/07 Javascript
微信小程序之获取当前位置经纬度以及地图显示详解
2017/05/09 Javascript
使用vs code开发Nodejs程序的使用方法
2017/09/21 NodeJs
利用Vue2.x开发实现JSON树的方法
2018/01/04 Javascript
vue.js 实现图片本地预览 裁剪 压缩 上传功能
2018/03/01 Javascript
Node.js中的不安全跳转如何防御详解
2018/10/21 Javascript
node.js Promise对象的使用方法实例分析
2019/12/26 Javascript
简单了解vue 插值表达式Mustache
2020/07/22 Javascript
vue mvvm数据响应实现
2020/11/11 Javascript
详解如何用OpenCV + Python 实现人脸识别
2017/10/20 Python
python 使用pandas计算累积求和的方法
2019/02/08 Python
python实现大文件分割与合并
2019/07/22 Python
如何在python开发工具PyCharm中搭建QtPy环境(教程详解)
2020/02/04 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
2021/03/03 Python
css3+jq创作含苞待放的荷花
2014/02/20 HTML / CSS
以太网Ethernet IEEE802.3
2013/08/05 面试题
临床护理求职信
2014/04/26 职场文书
校园环保广播稿(3篇)
2014/09/15 职场文书
维稳工作承诺书
2015/01/20 职场文书
大学生村官入党自传
2015/06/26 职场文书
学习十八大的感悟
2015/08/11 职场文书
用Python远程登陆服务器的步骤
2021/04/16 Python