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 相关文章推荐
NT IIS下用ODBC连接数据库
Oct 09 PHP
php设计模式 Prototype (原型模式)代码
Jun 26 PHP
解析PHP可变函数的经典用法
Jun 20 PHP
PHP缓存集成库phpFastCache用法
Dec 15 PHP
PHP实现的memcache环形队列类实例
Jul 28 PHP
PHP图形操作之Jpgraph学习笔记
Dec 25 PHP
php倒计时出现-0情况的解决方法
Jul 28 PHP
PHP巧妙利用位运算实现网站权限管理的方法
Mar 12 PHP
php实现微信支付之现金红包
May 30 PHP
Yii2语言国际化的配置教程
Aug 19 PHP
laravel框架语言包拓展实现方法分析
Nov 22 PHP
laravel通用化的CURD的实现
Dec 13 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
索尼SONY ICF-SW7600GR电路分析与改良
2021/03/02 无线电
php 操作调试的方法
2012/07/12 PHP
基于PHP 面向对象之成员方法详解
2013/05/04 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
让Laravel API永远返回JSON格式响应的方法示例
2018/09/05 PHP
PHP 代码简洁之道(小结)
2019/10/16 PHP
使用JavaScript和C#中获得referer
2014/11/14 Javascript
理解JavaScript事件对象
2016/01/25 Javascript
AngularJS实现Model缓存的方式
2016/02/03 Javascript
jQuery Form表单取值的方法
2017/01/11 Javascript
Vue.js实现多条件筛选、搜索、排序及分页的表格功能
2020/11/24 Javascript
Angular2使用Guard和Resolve进行验证和权限控制
2017/04/24 Javascript
微信小程序显示下拉列表功能【附源码下载】
2017/12/12 Javascript
js 索引下标之li集合绑定点击事件
2018/01/12 Javascript
Vue中的无限加载vue-infinite-loading的方法
2018/04/08 Javascript
vue如何判断dom的class
2018/04/26 Javascript
Vue无限滑动周选择日期的组件的示例代码
2018/07/18 Javascript
vuex页面刷新后数据丢失的方法
2019/01/17 Javascript
Vue动态生成el-checkbox点击无法赋值的解决方法
2019/02/21 Javascript
vue 实现路由跳转时更改页面title
2019/11/05 Javascript
vue 实现tab切换保持数据状态
2020/07/21 Javascript
javascript canvas实现简易时钟例子
2020/09/05 Javascript
[42:06]2019国际邀请赛全明星赛 8.23
2019/09/05 DOTA
Python 字符串操作方法大全
2014/03/11 Python
Python与R语言的简要对比
2017/11/14 Python
python执行CMD指令,并获取返回的方法
2018/12/19 Python
Nike英国官网:Nike.com (UK)
2017/02/13 全球购物
Ajax的优点和缺点
2014/11/21 面试题
后勤部长岗位职责
2013/12/14 职场文书
房地产销售计划书
2014/01/10 职场文书
新书吧创业计划书
2014/01/31 职场文书
销售人员求职的自我评价分享
2014/03/15 职场文书
销售简历自我评价怎么写
2014/09/26 职场文书
鲁迅故居导游词
2015/02/05 职场文书
2015年幼师工作总结
2015/04/28 职场文书
Python列表的索引与切片
2022/04/07 Python