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 相关文章推荐
一个很方便的 XML 类!!原创的噢
Oct 09 PHP
php入门小知识
Mar 24 PHP
PHP 字符串编码截取函数(兼容utf-8和gb2312)
May 02 PHP
PHP版国家代码、缩写查询函数代码
Aug 14 PHP
PHP中文处理 中文字符串截取(mb_substr)和获取中文字符串字数
Nov 10 PHP
有关PHP中MVC的开发经验分享
May 17 PHP
PHP使用array_multisort对多个数组或多维数组进行排序
Dec 16 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
Aug 28 PHP
PHP两个n位的二进制整数相加问题的解决
Aug 26 PHP
php链式操作的实现方式分析
Aug 12 PHP
PHP Primary script unknown 解决方法总结
Aug 22 PHP
Yii2.0框架behaviors方法使用实例分析
Sep 30 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使用CURL伪造IP和来源实例详解
2015/01/15 PHP
非常重要的php正则表达式详解
2016/01/04 PHP
Yii+MYSQL锁表防止并发情况下重复数据的方法
2016/07/14 PHP
php表单文件iframe异步上传实例讲解
2017/07/26 PHP
Yii 框架使用Forms操作详解
2020/05/18 PHP
javascript模仿msgbox提示效果代码
2008/06/10 Javascript
document.forms用法示例介绍
2014/06/26 Javascript
javascript使用call调用微信API
2014/12/15 Javascript
使用微信内置浏览器点击下拉框出现页面乱跳转现象(iphone),该怎么办
2016/01/04 Javascript
JS定时器使用,定时定点,固定时刻,循环执行详解
2016/05/31 Javascript
原生JS发送异步数据请求
2017/06/08 Javascript
AngularJS的$location使用方法详解
2017/10/19 Javascript
vue 表单验证按钮事件交由父组件触发的方法
2018/12/17 Javascript
详解Vue-Router源码分析路由实现原理
2019/05/15 Javascript
解决layui的radio属性或别的属性没显示出来的问题
2019/09/26 Javascript
解决Angularjs异步操作后台请求用$q.all排列先后顺序问题
2019/11/29 Javascript
vue 项目引入echarts 添加点击事件操作
2020/09/09 Javascript
Python多线程爬虫简单示例
2016/03/04 Python
浅谈flask中的before_request与after_request
2018/01/20 Python
python3+PyQt5实现柱状图
2018/04/24 Python
python自动查询12306余票并发送邮箱提醒脚本
2018/05/21 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
2020/12/11 Python
解决TensorFlow训练模型及保存数量限制的问题
2021/03/03 Python
浅析canvas元素的html尺寸和css尺寸对元素视觉的影响
2019/07/22 HTML / CSS
美国女孩洋娃娃店:American Girl
2017/10/24 全球购物
美国益智玩具购物网站:Fat Brain Toys
2017/11/03 全球购物
Under Armour安德玛中国官网:美国高端运动科技品牌
2018/03/09 全球购物
现金会计岗位职责
2013/12/05 职场文书
酒店总经理欢迎词
2014/01/08 职场文书
实习会计求职自荐信范文
2014/03/10 职场文书
2015年八一建军节演讲稿
2015/03/19 职场文书
行政人事主管岗位职责
2015/04/11 职场文书
2015年青年教师工作总结
2015/05/25 职场文书
我在伊朗长大观后感
2015/06/16 职场文书
JavaScript数组reduce()方法的语法与实例解析
2021/07/07 Javascript
Win10/Win11 任务栏替换成经典样式
2022/04/19 数码科技