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 相关文章推荐
phpmyadmin3 安装配置图解教程
Mar 29 PHP
PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
May 07 PHP
smarty基础之拼接字符串的详解
Jun 18 PHP
FireFox浏览器使用Javascript上传大文件
Oct 30 PHP
php的zip解压缩类pclzip使用示例
Mar 14 PHP
PHP中的use关键字概述
Jul 23 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
Dec 16 PHP
php生成短域名函数
Mar 23 PHP
解析WordPress中函数钩子hook的作用及基本用法
Dec 22 PHP
php实现socket推送技术的示例
Dec 20 PHP
PHP中PCRE正则解析代码详解
Apr 26 PHP
详解PHP 7.4 中数组延展操作符语法知识点
Jul 19 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
德生BCL3000的电路分析和打磨
2021/03/02 无线电
PHP远程连接MYSQL数据库非常慢的解决方法
2008/07/05 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
2017/08/28 PHP
php微信公众号开发之简答题
2018/10/20 PHP
JS 实现完美include载入实现代码
2010/08/05 Javascript
关于JS控制代码暂停的实现方法分享
2012/10/11 Javascript
javascript生成json数据简单示例分享
2014/02/14 Javascript
JQuery性能优化的几点建议
2014/05/14 Javascript
javascript中Array数组的迭代方法实例分析
2015/02/04 Javascript
BootStrap智能表单实战系列(七)验证的支持
2016/06/13 Javascript
Vue组件实例间的直接访问实现代码
2017/08/20 Javascript
jQuery 实现鼠标画框并对框内数据选中的实例代码
2017/08/29 jQuery
基于layui轮播图满屏是高度自适应的解决方法
2019/09/16 Javascript
JS实现拼图游戏
2021/01/29 Javascript
JS实现简单移动端鼠标拖拽
2020/07/23 Javascript
js+audio实现音乐播放器
2020/09/13 Javascript
利用QT写一个极简单的图形化Python闹钟程序
2015/04/07 Python
Python中的index()方法使用教程
2015/05/18 Python
Python中用altzone()方法处理时区的教程
2015/05/22 Python
Python运算符重载用法实例分析
2015/06/01 Python
python中的字典使用分享
2016/07/31 Python
使用Python写一个贪吃蛇游戏实例代码
2017/08/21 Python
python提取图像的名字*.jpg到txt文本的方法
2018/05/10 Python
对python requests发送json格式数据的实例详解
2018/12/19 Python
Django学习之文件上传与下载
2019/10/06 Python
python输出pdf文档的实例
2020/02/13 Python
Python类型转换的魔术方法详解
2020/12/23 Python
纬创Java面试题笔试题
2014/10/02 面试题
行政助理的岗位职责
2014/02/18 职场文书
行政副总岗位职责
2014/02/23 职场文书
闭幕式主持词
2014/04/02 职场文书
无房产证房屋转让协议书合同样本
2014/10/18 职场文书
2014年仓库管理员工作总结
2014/11/18 职场文书
2015新员工试用期工作总结
2014/12/12 职场文书
住房公积金贷款工资证明
2015/06/12 职场文书
2019幼儿教师求职信(3篇)
2019/09/20 职场文书