依赖注入原理 php,PHP依赖注入原理与用法分析
本文实例讲述了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依赖注入原理与用法分析相关推荐
- php+insert+into+注入,PHP+MySQL之Insert Into数据插入用法分析
本文实例讲述了PHP+MySQL之Insert Into数据插入用法.分享给大家供大家参考.具体如下: INSERT INTO 语句用于向数据库表中插入新纪录. 向数据库表插入数据 INSERT IN ...
- 依赖注入原理(为什么需要依赖注入)
0. 前言 在软件工程领域,依赖注入(Dependency Injection)是用于实现控制反转(Inversion of Control)的最常见的方式之一.本文主要介绍依赖注入原理和常见的实现方 ...
- PHP的依赖注入是干什么的?底层原理是什么?
PHP的依赖注入是一种设计模式,它可以将对象的创建和它所依赖的对象的创建分离开来,从而降低对象之间的耦合性,提高代码的可测试性和可维护性. 底层原理是通过将一个类所需要的依赖通过构造函数.属性或者方法 ...
- 调用其他app 的lib_ButterKnife执行效率为什么比其他注入框架高?它的原理是什么...
面试官: ButterKnife为什么执行效率为什么比其他注入框架高?它的原理是什么 心理分析: ButterKnife框架一直都是使用,很少又开发者对butterknife深入研究的,既然你是面试A ...
- SSM源码分析之Spring05-DI实现原理(基于Annotation 注入)
目录导航 前言 注解的引入 AnnotationConfigApplicationContext 对注解Bean初始化 AnnotationConfigApplicationContext注册注解Be ...
- java中四种注入注解,Spring中依赖注入的四种方式
在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入 这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式). 使用属性的sett ...
- php 依赖注入框架,通过实现依赖注入和路由,构建一个自己的现代化PHP框架
如何提高自己编写代码的能力呢?我们首先想到的是阅读学习优秀的开源项目,然后写一个自己的web框架或类库组件.作为web开发者,我们通常都是基于面向对象OOP来开发的,所以面向对象的设计能力或者说设计模 ...
- 原理+实战掌握SQL注入方法
本文首发于先知社区 原理+实战掌握SQL注入方法 前言: SQL注入是web安全中最常见的攻击方式,SQL注入有很多方法,但如果只知道payload,不知道原理,感觉也很难掌握,这次就总结一下我所遇到 ...
- 什么是依赖注入 php,什么是依赖注入?
译文首发于 什么是依赖注入,转载请注明出处. 本文是依赖注入(Depeendency Injection)系列教程的第一篇文章,本系列教程主要讲解如何使用 PHP 实现一个轻量级服务容器,教程包括: ...
- mysql bind param_mysql绑定参数bind_param原理以及防SQL注入
下面我们来模拟一个用户登录的过程.. $username = "aaa"; $pwd = "pwd"; $sql = "SELECT * FROM t ...
最新文章
- OpenGL学习(4)——纹理(补)
- 基于ServletJsp的网上书店设计(二)
- django-行对向的反向查找
- linux和Windows之间互传文件
- Android的EditText文字动态监听
- latex 基本用法(四)
- 两道动态规划的作业题
- 定时器Cron 表达式解析工具
- AI智能人脸识别系统
- matlab数字图像处理实验一:图像的读取显示存储、平移镜像放大缩小及旋转
- 支付宝对账单功能开发
- 史上最强!PC时代的20位英雄
- python的UnboundLocalError: local variable 'xxx' referenced b
- Windows预览体验计划空白等一些问题的解决办法
- MYSQL报1265和1366错误
- 中介房屋买卖合同及违约责任
- OpenSSL安装使用(二):OpenSSL安装说明
- 使用腾讯文档收集快递信息
- 企业级项目|用Python进行web开发企业统一用户认证和权限控制平台
- 垃圾分类微信小程序——云开发+CMS+微应用+百度智能云图片识别
热门文章
- html聚光灯特效,css实现聚光灯效果的代码分享
- java openssl dgst_(7) openssl dgst(生成和验证数字签名)
- liunx下搭建mysql主从_linux下搭建mysql主从
- 【Git、GitHub、GitLab】七 git中分支的删除以及出现分离头指针的情况
- three20 TTTableViewController + TTActionSheetController
- K-D Tree 学习笔记
- git add -A 、git add -u 、 git add . 三种区别
- angularJS中,怎么阻止事件冒泡
- 原 hibernate与mysql字段类型对应关系
- 【转】在C#中使用SQLite