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 相关文章推荐
phpfans留言版用到的install.php
Jan 04 PHP
PHP类中Static方法效率测试代码
Oct 17 PHP
php通用防注入程序 推荐
Feb 26 PHP
ecshop 批量上传(加入自定义属性)
Mar 20 PHP
一个基于phpQuery的php通用采集类分享
Apr 09 PHP
ThinkPHP之用户注册登录留言完整实例
Jul 22 PHP
常用PHP框架功能对照表
Oct 23 PHP
避免Smarty与CSS语法冲突的方法
Mar 02 PHP
php发送邮件的问题详解
Jun 22 PHP
PHP利用APC模块实现大文件上传进度条的方法
Oct 29 PHP
Yii中的cookie的发送和读取
Jul 27 PHP
php中static和const关键字用法分析
Dec 07 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
CodeIgniter读写分离实现方法详解
2016/01/20 PHP
浅析Yii2中GridView常见操作
2016/04/22 PHP
深入了解PHP中的Array数组和foreach
2016/11/06 PHP
JQuery开发的数独游戏代码
2010/10/29 Javascript
杨氏矩阵查找的JS代码
2013/03/21 Javascript
JS隐藏参数post传值实例
2013/04/18 Javascript
javascript正则匹配汉字、数字、字母、下划线
2014/04/10 Javascript
跟我学Nodejs(一)--- Node.js简介及安装开发环境
2014/05/20 NodeJs
原生javascript实现图片弹窗交互效果
2015/01/12 Javascript
jQuery实现DIV层收缩展开的方法
2015/02/27 Javascript
js禁止页面刷新与后退的方法
2015/06/08 Javascript
Jsonp post 跨域方案
2015/07/06 Javascript
vue.js指令v-for使用及索引获取
2016/11/03 Javascript
jQuery动态添加.active 实现导航效果代码思路详解
2017/08/29 jQuery
React Native模块之Permissions权限申请的实例相机
2017/09/28 Javascript
vue获取DOM元素并设置属性的两种实现方法
2017/09/30 Javascript
webstorm和.vue中es6语法报错的解决方法
2018/05/08 Javascript
使用Angular-CLI构建NPM包的方法
2018/09/07 Javascript
[14:00]DOTA2国际邀请赛史上最长大战 赛后专访B神
2013/08/10 DOTA
paramiko模块安装和使用(远程登录服务器)
2014/01/27 Python
Python基于list的append和pop方法实现堆栈与队列功能示例
2017/07/24 Python
用于业余项目的8个优秀Python库
2018/09/21 Python
Python操作json的方法实例分析
2018/12/06 Python
基于django channel实现websocket的聊天室的方法示例
2019/04/11 Python
详解numpy1.19.4与python3.9版本冲突解决
2020/12/15 Python
html5 拖拽上传图片实例演示
2013/04/01 HTML / CSS
澳大利亚在线百货商店:Real Smart
2017/08/13 全球购物
Pharmacy Online中文直邮网站:澳洲大型药房
2020/06/27 全球购物
《诚实与信任》教学反思
2014/04/10 职场文书
普通党员对照检查材料
2014/09/24 职场文书
大学生思想道德自我评价
2015/03/09 职场文书
公司清洁工岗位职责
2015/04/15 职场文书
2019暑假阅读倡议书
2019/06/24 职场文书
Django如何与Ajax交互
2021/04/29 Python
Golang 实现获取当前函数名称和文件行号等操作
2021/05/08 Golang
mysql sql常用语句大全
2022/06/21 MySQL