本文实例讲述了PHP依赖注入原理与用法。分享给大家供大家参考,具体如下:

引言

依然是来自到喜啦的一道面试题,你知道什么是依赖注入吗?

依赖注入(DI)的概念虽然听起来很深奥,但是如果你用过一些新兴的php框架的话,对于DI一定不陌生,因为它们多多少少都用到了依赖注入来处理类与类之间的依赖关系。

php中传递依赖关系的三种方案

其实要理解DI,首先要明白在php中如何传递依赖关系。

第一种方案,也是最不可取的方案,就是在A类中直接用new关键词来创建一个B类,如下代码所示:

class A

{

public function __construct()

{

$b = new B();

}

}

为什么这种方案不可取呢?因为这样的话,A与B就耦合在了一起,也就是说A类无法脱离B类工作。

第二种方案就是在A类的方法中传入需要的B类,如下代码所示:

class A

{

public function __construct(B $b)

{

}

}

这种方法比第一种方案有了改进,A类不必与B类捆绑在一起,只要传入的类满足A类的需求,也可以是C类,也可以是D类等等。

但是这种方案的弊端在于如果A类依赖的类较多,参数列表会很长,容易发生混乱。

第三种方案是使用set方法传入,如下代码所示:

class A

{

public function setB(B $b)

{

$this->b = $b;

}

}

这种方案同样存在和第二种方案一样的弊端,当依赖的类增多时,我们需要些很多很多的set方法。

这时我们在想如果有一个专门的类(或者说一个容器)可以帮我们管理这些依赖关系就好了。

一个简单的依赖注入的例子

如下代码来自twittee:

class Container {

private $s=array();

function __set($k, $c) { $this->s[$k]=$c; }

function __get($k) { return $this->s[$k]($this); }

}

有了container类之后我们可以怎样管理A与B之间的依赖关系呢,用代码说话吧:

class A

{

private $container;

public function __construct(Container $container)

{

$this->container = $container;

}

public function doSomeThing()

{

//do something which needs class B

$b = $this->container->getB();

//to do

}

}

再将B类注入到容器类中:

$c = new Container();

$c->setB(new B());

还可以传入一个匿名函数,这样B类就不会在传入时就立即实例化,而是在真正调用时才完成实例化的工作:

$c = new Container();

$c->setB(function (){

return new B();

});

这里举的只是一个很简单的例子,在实际中,容器类要考虑的有很多,比如延迟加载等等。希望本文所述对大家PHP程序设计有所帮助。

依赖注入原理 php,PHP依赖注入原理与用法分析相关推荐

  1. php+insert+into+注入,PHP+MySQL之Insert Into数据插入用法分析

    本文实例讲述了PHP+MySQL之Insert Into数据插入用法.分享给大家供大家参考.具体如下: INSERT INTO 语句用于向数据库表中插入新纪录. 向数据库表插入数据 INSERT IN ...

  2. 依赖注入原理(为什么需要依赖注入)

    0. 前言 在软件工程领域,依赖注入(Dependency Injection)是用于实现控制反转(Inversion of Control)的最常见的方式之一.本文主要介绍依赖注入原理和常见的实现方 ...

  3. PHP的依赖注入是干什么的?底层原理是什么?

    PHP的依赖注入是一种设计模式,它可以将对象的创建和它所依赖的对象的创建分离开来,从而降低对象之间的耦合性,提高代码的可测试性和可维护性. 底层原理是通过将一个类所需要的依赖通过构造函数.属性或者方法 ...

  4. 调用其他app 的lib_ButterKnife执行效率为什么比其他注入框架高?它的原理是什么...

    面试官: ButterKnife为什么执行效率为什么比其他注入框架高?它的原理是什么 心理分析: ButterKnife框架一直都是使用,很少又开发者对butterknife深入研究的,既然你是面试A ...

  5. SSM源码分析之Spring05-DI实现原理(基于Annotation 注入)

    目录导航 前言 注解的引入 AnnotationConfigApplicationContext 对注解Bean初始化 AnnotationConfigApplicationContext注册注解Be ...

  6. java中四种注入注解,Spring中依赖注入的四种方式

    在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入  这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式). 使用属性的sett ...

  7. php 依赖注入框架,通过实现依赖注入和路由,构建一个自己的现代化PHP框架

    如何提高自己编写代码的能力呢?我们首先想到的是阅读学习优秀的开源项目,然后写一个自己的web框架或类库组件.作为web开发者,我们通常都是基于面向对象OOP来开发的,所以面向对象的设计能力或者说设计模 ...

  8. 原理+实战掌握SQL注入方法

    本文首发于先知社区 原理+实战掌握SQL注入方法 前言: SQL注入是web安全中最常见的攻击方式,SQL注入有很多方法,但如果只知道payload,不知道原理,感觉也很难掌握,这次就总结一下我所遇到 ...

  9. 什么是依赖注入 php,什么是依赖注入?

    译文首发于 什么是依赖注入,转载请注明出处. 本文是依赖注入(Depeendency Injection)系列教程的第一篇文章,本系列教程主要讲解如何使用 PHP 实现一个轻量级服务容器,教程包括: ...

  10. mysql bind param_mysql绑定参数bind_param原理以及防SQL注入

    下面我们来模拟一个用户登录的过程.. $username = "aaa"; $pwd = "pwd"; $sql = "SELECT * FROM t ...

最新文章

  1. OpenGL学习(4)——纹理(补)
  2. 基于ServletJsp的网上书店设计(二)
  3. django-行对向的反向查找
  4. linux和Windows之间互传文件
  5. Android的EditText文字动态监听
  6. latex 基本用法(四)
  7. 两道动态规划的作业题
  8. 定时器Cron 表达式解析工具
  9. AI智能人脸识别系统
  10. matlab数字图像处理实验一:图像的读取显示存储、平移镜像放大缩小及旋转
  11. 支付宝对账单功能开发
  12. 史上最强!PC时代的20位英雄
  13. python的UnboundLocalError: local variable 'xxx' referenced b
  14. Windows预览体验计划空白等一些问题的解决办法
  15. MYSQL报1265和1366错误
  16. 中介房屋买卖合同及违约责任
  17. OpenSSL安装使用(二):OpenSSL安装说明
  18. 使用腾讯文档收集快递信息
  19. 企业级项目|用Python进行web开发企业统一用户认证和权限控制平台
  20. 垃圾分类微信小程序——云开发+CMS+微应用+百度智能云图片识别

热门文章

  1. html聚光灯特效,css实现聚光灯效果的代码分享
  2. java openssl dgst_(7) openssl dgst(生成和验证数字签名)
  3. liunx下搭建mysql主从_linux下搭建mysql主从
  4. 【Git、GitHub、GitLab】七 git中分支的删除以及出现分离头指针的情况
  5. three20 TTTableViewController + TTActionSheetController
  6. K-D Tree 学习笔记
  7. git add -A 、git add -u 、 git add . 三种区别
  8. angularJS中,怎么阻止事件冒泡
  9. 原 hibernate与mysql字段类型对应关系
  10. 【转】在C#中使用SQLite