php依赖注入知识点详解
作者:V 发布时间:2024-05-02 17:33:00
标签:php,依赖注入
引言
你知道什么是依赖注入吗?依赖注入(DI)的概念虽然听起来很深奥,但是如果你用过一些新兴的php框架的话,对于DI一定不陌生,因
为它们多多少少都用到了依赖注入来处理类与类之间的依赖关系。
php中传递依赖关系的三种方案
其实要理解DI,首先要明白在php中如何传递依赖关系。
第一种方案,也是最不可取的方案,就是在A类中直接用new关键词来创建一个B类,如下代码所示:
<?php
class A
{
public function __construct()
{
$b = new B();
}
}
为什么这种方案不可取呢?因为这样的话,A与B就耦合在了一起,也就是说A类无法脱离B类工作。
第二种方案就是在A类的方法中传入需要的B类
如下代码所示:
<?php
class A
{
public function __construct(B $b)
{
}
}
这种方法比第一种方案有了改进,A类不必与B类捆绑在一起,只要传入的类满足A类的需求,也可以是C类,也可以是D类等等。但是这
种方案的弊端在于如果A类依赖的类较多,参数列表会很长,容易发生混乱。
第三种方案是使用set方法传入
如下代码所示:
<?php
class A
{
public function setB(B $b)
{
$this->b = $b;
}
}
这种方案同样存在和第二种方案一样的弊端,当依赖的类增多时,我们需要些很多很多的set方法。这时我们在想如果有一个专门的类
(或者说一个容器)可以帮我们管理这些依赖关系就好了。
一个简单的依赖注入的例子
如下代码来自twittee:
<?php
class Container {
private $s=array();
function __set($k, $c) { $this->s[$k]=$c; }
function __get($k) { return $this->s[$k]($this); }
}
有了container类之后我们可以怎样管理A与B之间的依赖关系呢,用代码说话吧:
<?php
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();
});
这里举的只是一个很简单的例子,在实际中,容器类要考虑的有很多,比如延迟加载等等。
以上内容仅供参考!感谢大家的学习和对asp之家的支持。
来源:https://www.php.cn/php-ask-430664.html


猜你喜欢
- 网站开发时经常需要在某个页面需要实现对大量图片的浏览,如果考虑流量的话,大可以像pconline一样每个页面只显示一张图片,让用户每看一张图
- 不用切图,只要设置基本的 图片及其属性即可!用鼠标右键控制图片翻转!<style>*{ FONT-SIZE: 12px; }se
- 数学是优美的. 听上去有点奇怪? 当我第一次开始设计的时候,我确信如此。数学如此刻板乏味。你可能会惊讶的发现,最美观的设计,艺术作品,物体,
- 用python画图很多是根据z=f(x,y)来画图的,本博文将三个对应的坐标点输入画图:散点图:import matplotlib.pypl
- 引言Git 中有些操作命令比较长,单词多,不容易记忆。例如把一个dev开发分支合并到master分支,就需要敲:git merge --no
- permute(dims)将tensor的维度换位。参数:参数是一系列的整数,代表原来张量的维度。比如三维就有0,1,2这些dimensio
- 本文实例讲述了Python3实现爬取简书首页文章标题和文章链接的方法。分享给大家供大家参考,具体如下:from urllib import
- 合理地扩大页面链接响应区域可以提高网页的易用性。同时还要兼顾到链接的交互一致性以及视觉上的平衡,就需要做一些特殊的处理。实例一:一张图配一个
- 现有1.php内容如下: <?phpecho 'hi\nhi';在命令行中执行该文件: bash >> p
- 1.前台ajax数据提交<form id="login_form" action="" met
- 本篇主要讲述,如何在微信中打开自家页面后,弹窗请求用户授权,以便拿到用户的微信信息。首先说一下,完成自定义分享信息的,从无到有的流程:基础硬
- 什么是insert buffer? 插入缓冲,也称之为insert buffer,它是innodb存储引擎的关键特性
- 一、SQL注入简介SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,
- 需要注意的是,firefox下必须要设置下 signed.applets.codebase_principal_support 在 fire
- DCL(Data Control Language):数据控制语言,用来定义数据库的访问权限和安全级别,及创建用户。一、管理用户1、创建用户
- 利用图标工具(有很多)制作图标文件(favicon.ico)上传到网站所在的服务器的根目录下,这个文件必须是16*16大小的图标文件。当然,
- Python中有以下几个基本的数据类型:整数 int字符串 str浮点数 float集合 set列表 list元组 tuple字典 dict
- 编程一直是在课余时间,放假时间自学,到现在为止也有半年了。这是我自己用python实现的连连看,也是第一个完成的游戏,虽然极其简陋。思路呢,
- #!/usr/local/python import os import time import string source=['/
- 背景golang版本:1.16之前遇到的问题,docker启动时禁用了oom-kill(kill后服务受损太大),导致golang内存使用接