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通用防注入程序 推荐
Feb 26 PHP
使用php shell命令合并图片的代码
Jun 23 PHP
php中使用__autoload()自动加载未定义类的实现代码
Feb 06 PHP
关于PHP session 存储方式的详细介绍
Jun 25 PHP
PHPExcel读取EXCEL中的图片并保存到本地的方法
Feb 14 PHP
php实现统计网站在线人数的方法
May 12 PHP
php中文验证码实现方法
Jun 18 PHP
PHP截取IE浏览器并缩小原图的方法
Mar 04 PHP
php截取视频指定帧为图片
May 16 PHP
Linux下安装Memcached服务器和客户端与PHP使用示例
Apr 15 PHP
Laravel 不同生产环境服务器的判断实践
Oct 15 PHP
php获取小程序码的实现代码(B类接口)
Jun 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
多php服务器实现多session并发运行
2006/10/09 PHP
ThinkPHP中Common/common.php文件常用函数功能分析
2016/05/20 PHP
PHP获取链表中倒数第K个节点的方法
2018/01/18 PHP
jquery验证表单中的单选与多选实例
2013/08/18 Javascript
JavaScript遍历table表格中的某行某列并打印其值
2014/07/08 Javascript
javascript函数中参数传递问题示例探讨
2014/07/31 Javascript
jquery常用方法及使用示例汇总
2014/11/08 Javascript
node.js中的dns.getServers方法使用说明
2014/12/08 Javascript
javascript中Date对象的getDay方法使用指南
2014/12/22 Javascript
实例详解jQuery的无new构建
2016/08/02 Javascript
深入浅出 jQuery中的事件机制
2016/08/23 Javascript
jQuery展示表格点击变色、全选、删除
2017/01/05 Javascript
angular和BootStrap3实现购物车功能
2017/01/25 Javascript
javascript html5轻松实现拖动功能
2017/03/01 Javascript
Django中使用jquery的ajax进行数据交互的实例代码
2017/10/15 jQuery
react+redux的升级版todoList的实现
2017/12/18 Javascript
vue.js,ajax渲染页面的实例
2018/02/11 Javascript
详解vue-cli3使用
2018/08/14 Javascript
JavaScript之数组扁平化详解
2019/06/03 Javascript
file-loader打包图片文件时路径错误输出为[object-module]的解决方法
2020/01/03 Javascript
VueJS实现用户管理系统
2020/05/29 Javascript
angular共享依赖的解决方案分享
2020/10/15 Javascript
[01:11:21]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第一场 3月6日
2021/03/11 DOTA
利用python和百度地图API实现数据地图标注的方法
2019/05/13 Python
简单了解Django应用app及分布式路由
2019/07/24 Python
python中hasattr()、getattr()、setattr()函数的使用
2019/08/16 Python
美国知名的摄影器材销售网站:Adorama
2017/02/01 全球购物
中秋节超市促销方案
2014/01/30 职场文书
营销与策划专业求职信
2014/06/20 职场文书
年度优秀员工获奖感言
2014/08/15 职场文书
2014年审计工作总结
2014/11/17 职场文书
中班下学期个人总结
2015/02/12 职场文书
2015年“世界无车日”活动方案
2015/05/06 职场文书
党小组考察意见
2015/06/02 职场文书
和领导吃饭祝酒词
2015/08/11 职场文书
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/04/22 无线电