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缓存技术的使用说明
Aug 06 PHP
PHP中读取照片exif信息的方法
Aug 20 PHP
php简单smarty入门程序实例
Jun 11 PHP
PHP+MySQL之Insert Into数据插入用法分析
Sep 27 PHP
PHP创建PowerPoint2007文档的方法
Dec 10 PHP
PHP的PDO操作简单示例
Mar 30 PHP
php获取linux命令结果的实例
Mar 13 PHP
通过修改Laravel Auth使用salt和password进行认证用户详解
Aug 17 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
Dec 21 PHP
php获取用户真实IP和防刷机制的实例代码
Nov 28 PHP
php写入mysql中文乱码的实例解决方法
Sep 17 PHP
PHP 实现重载
Mar 09 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+DBM的同学录程序(1)
2006/10/09 PHP
PHP使用finfo_file()函数检测上传图片类型的实现方法
2017/04/18 PHP
ThinkPHP3.1.x修改成功与失败跳转页面的方法
2017/09/29 PHP
理解Javascript_15_作用域分配与变量访问规则,再送个闭包
2010/10/20 Javascript
jquery 回车事件实现代码
2011/08/23 Javascript
九种js弹出对话框的方法总结
2013/03/12 Javascript
JS滚轮事件onmousewheel使用介绍
2013/11/01 Javascript
jQuery对于显示和隐藏等常用状态的判断方法
2014/12/13 Javascript
js简单的点击返回顶部效果实现方法
2015/04/10 Javascript
Angularjs注入拦截器实现Loading效果
2015/12/28 Javascript
Javascript缓存API
2016/06/14 Javascript
通过bootstrap全面学习less
2016/11/09 Javascript
Bootstrap基本样式学习笔记之图片(6)
2016/12/07 Javascript
js使用generator函数同步执行ajax任务
2017/09/05 Javascript
gulp安装以及打包合并的方法教程
2017/11/19 Javascript
Vue项目中设置背景图片方法
2018/02/21 Javascript
cnpm加速Angular项目创建的方法
2018/09/07 Javascript
element-ui upload组件多文件上传的示例代码
2018/10/17 Javascript
今天,小程序正式支持 SVG
2019/04/20 Javascript
Vue-Cli 3.0 中配置高德地图的两种方式
2019/06/19 Javascript
浅谈vue的第一个commit分析
2020/06/08 Javascript
vue引入静态js文件的方法
2020/06/20 Javascript
在Vuex中Mutations修改状态操作
2020/07/24 Javascript
vue项目如何监听localStorage或sessionStorage的变化
2021/01/04 Vue.js
Python3中常用的处理时间和实现定时任务的方法的介绍
2015/04/07 Python
python GUI实例学习
2017/11/21 Python
Python中join函数简单代码示例
2018/01/09 Python
python多个模块py文件的数据共享实例
2019/01/11 Python
对python使用telnet实现弱密码登录的方法详解
2019/01/26 Python
python解决OpenCV在读取显示图片的时候闪退的问题
2021/02/23 Python
Michael Kors英国官网:美国奢侈品品牌
2019/11/13 全球购物
新员工培训个人的自我评价
2013/10/09 职场文书
求职信格式范本
2013/11/15 职场文书
六五普法规划实施方案
2014/03/21 职场文书
党务公开方案
2014/05/06 职场文书
社团活动总结怎么写
2014/06/30 职场文书