首页 后端开发 php教程 聊聊框架开发的依赖注入,容器与外观模式(上部)

聊聊框架开发的依赖注入,容器与外观模式(上部)

Jul 14, 2018 am 11:53 AM
依赖注入

这篇文章主要介绍了关于聊聊框架开发的依赖注入,容器与外观模式(上部),有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

一、依赖注入与解藕

热恋中的男女,经常会说,离开你,我就活不下去了,这是多么深的依赖呀~~

编程中的依赖,与我们生活中的依赖,本质是一样的:我的工作,离不开你的支持,没有你,就没有我。

依赖有二种: 一是功能上,二是顺序上的,下面我们用实例来进行说明:

我们现在有这样的一个任务:

用户登录操作

1.涉及数据库操作,数据验证,模板输出;

2.分别对应Db类,Validate类,View类;

3.仅做演示,具体实例请同学们自行完成;

在正式编码前,先简单了解一下什么是客户端?

1. 客户端:只要能发起请求,都可以看作客户端,浏览器,一段代码都可以

2. 以下的代码,在实例化User类,并调用其内部的loign方法进行工作

3. 所以,$user = new User();就是客户端代码

4. 或者,也可以这样理解,凡写在类或函数等代码之外的,都可看作客户端

源码如下:

<?php 
//数据库操作类
class Db
{
//数据库连接
public function connect()
{
return &#39;数据库连接成功<br>&#39;;
}
}
//数据验证类
class Validate
{
//数据验证
public function check()
{
return &#39;数据验证成功<br>&#39;;
}
}
//视图图
class View
{
//内容输出
public function display()
{
return &#39;用户登录成功&#39;;
}
}
//用户类
class User
{
//用户登录操作
public function login()
{
//实例化Db类并调用connect()连接数据库
$db = new Db();
echo $db->connect();
//实例化Validate类并调用check()进行数据验证
$validate = new Validate();
echo $validate->check();
//实例化视图类并调用display()显示运行结果
$view = new View();
echo $view->display();
}
}
//创建User类
$user = new User();
//调用User对象的login方法进行登录操作
echo $user->login();
登录后复制

以上代码尽管可以正常工作,但仍存在以下问题:

1. 以上的四个类,只有User是实际工作类,其它三个都是工具类(Db,Validate,View)

2. 工作类中调用的工具类一旦发生变化,必须修改对这些工具类的所有引用代码,例如Db参数变化

3. 工作类的调用者必须对要用到的所有工具类,非常熟悉,对参数与返回值必须了解

4. 工作类对以上三个工具类,形成了严重的依赖,也叫类之间严重耦合

下面我们通过最常用的依赖注入(DI)来解藕

我们先了解一下解藕的基本思路:

1.依赖注入并不神性

2.本质上来说,就是对工具类的实例化不在工作类中完成,而是在工作类之外,即客户端完成

3.由于工具类实例化在客户端完成,所在在工作类中,必须要有接收器用来保存实例化的工具对象

4.此时,用户就可以将在客户端已经实例化好的工具对象,以参数的方式直接传递给工作类的方法

5.这种由外部直接将对象传入到当前工作类的方式,就叫依赖注入

源码如下:

<?php
//数据库操作类
class Db
{
//数据库连接
public function connect()
{
return &#39;数据库连接成功<br>&#39;;
}
}
//数据验证类
class Validate
{
//数据验证
public function check()
{
return &#39;数据验证成功<br>&#39;;
}
}
//视图图
class View
{
//内容输出
public function display()
{
return &#39;用户登录成功&#39;;
}
}
//用户类
class User
{
//创建三个成员属性,用来保存本类所依赖的对象
protected $db = null;
protected $validate = null;
protected $view = &#39;&#39;;
//用户登录操作
public function login(Db $db, Validate $validate, View $view)
{
//实例化Db类并调用connect()连接数据库
// $db = new Db();
echo $db->connect();
//实例化Validate类并调用check()进行数据验证
// $validate = new Validate();
echo $validate->check();
//实例化视图类并调用display()显示运行结果
// $view = new View();
echo $view->display();
}
}
//在客户端完成工具类的实例化(即工具类实例化前移)
$db = new Db();
$validate = new Validate();
$view = new View();
//创建User类
$user = new User();
//调用User对象的login方法进行登录操作
// echo $user->login();
// 将该类依赖的外部对象以参数方式注入到当前方法中,当然,推荐以构造器方式注入最方便
echo &#39;<h3>用依赖注入进行解藕:</h3>&#39;;
echo $user->login($db, $validate, $view);
登录后复制

虽然将依赖类的实例化前移到客户端,但解决了类之间的依赖问题

但是仍存在以下几个问题:

1.为了使工作类User正常工具,必须事先在外部将所需要的类全部事先实例化;

2.只要涉及实例化,就要求客户端(调用者)必须对这些依赖类的细节非常了解,例如参数与返回值

那么能不能让用户把实例化依赖类的步骤都省略掉呢?这样岂不是更好,更简单

我们调用外部依赖类,只要给一个类名,以及一个创建该类实例的方法(构造器)就可以了呢?

即: 我们只给出:  类名, 创建类实例的方法,其它一概不管

下面我们通过的"容器技术"来这现这种傻瓜式的的解藕过程

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

聊聊框架开发的依赖注入,容器与外观模式(下部)

以上是聊聊框架开发的依赖注入,容器与外观模式(上部)的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
<🎜>掩盖:探险33-如何获得完美的色度催化剂
2 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1677
14
CakePHP 教程
1430
52
Laravel 教程
1333
25
PHP教程
1278
29
C# 教程
1257
24
手把手带你了解Angular中的依赖注入 手把手带你了解Angular中的依赖注入 Dec 02, 2022 pm 09:14 PM

本篇文章带大家了解一下依赖注入,介绍一下依赖注入解决的问题和它原生的写法是什么,并聊聊Angular的依赖注入框架,希望对大家有所帮助!

在Phalcon框架中使用依赖注入(Dependency Injection)的方法 在Phalcon框架中使用依赖注入(Dependency Injection)的方法 Jul 30, 2023 pm 09:03 PM

在Phalcon框架中使用依赖注入(DependencyInjection)的方法引言:在现代的软件开发中,依赖注入(DependencyInjection)是一种常见的设计模式,旨在提高代码的可维护性和可测试性。而Phalcon框架作为一个快速、低耗的PHP框架,也支持使用依赖注入来管理和组织应用程序的依赖关系。本文将向您介绍如何在Phalcon框架中

使用JUnit单元测试框架进行依赖注入 使用JUnit单元测试框架进行依赖注入 Apr 19, 2024 am 08:42 AM

针对使用JUnit测试依赖注入,摘要如下:使用模拟对象创建依赖项:@Mock注解可创建依赖项的模拟对象。设置测试数据:@Before方法在每个测试方法前运行,用于设置测试数据。配置模拟行为:Mockito.when()方法配置模拟对象的预期行为。验证结果:assertEquals()断言检查实际结果与预期值是否匹配。实际应用:可使用依赖注入框架(如SpringFramework)注入依赖项,通过JUnit单元测试验证注入的正确性和代码的正常运行。

Golang函数参数传递中的依赖注入模式 Golang函数参数传递中的依赖注入模式 Apr 14, 2024 am 10:15 AM

在Go中,依赖注入(DI)模式通过函数参数传递实现,类型包括值传递和指针传递。在DI模式中,依赖项通常以指针传递,以提高解耦性、减少锁争用和支持可测试性。通过使用指针,函数与具体实现解耦,因为它只依赖于接口类型。指针传递还可以减少传递大对象的开销,从而减少锁争用。此外,DI模式可以轻松地为使用DI模式的函数编写单元测试,因为可以轻松地模拟依赖项。

Go语言:依赖注入指南 Go语言:依赖注入指南 Apr 07, 2024 pm 12:33 PM

答案:在Go语言中,依赖注入可以通过接口和结构体实现。定义一个描述依赖项行为的接口。创建一个实现该接口的结构体。在函数中通过接口作为参数注入依赖项。允许在测试或不同场景中轻松替换依赖项。

解释PHP中依赖注射(DI)的概念。 解释PHP中依赖注射(DI)的概念。 Apr 05, 2025 am 12:07 AM

在PHP中使用依赖注入(DI)的核心价值在于实现松耦合的系统架构。DI通过外部提供依赖的方式减少类之间的直接依赖关系,提高代码的可测试性和灵活性。使用DI时,可以通过构造函数、设值方法或接口注入依赖,并结合IoC容器管理对象生命周期和依赖关系。

如何在 Golang 中使用依赖注入进行单元测试? 如何在 Golang 中使用依赖注入进行单元测试? Jun 02, 2024 pm 08:41 PM

在Golang单元测试中使用依赖注入(DI)可以隔离要测试的代码,简化测试设置和维护。流行的DI库包括wire和go-inject,它们可以生成依赖项桩或模拟,供测试使用。DI测试的步骤包括设置依赖项、设置测试用例和断言结果。使用DI测试HTTP请求处理函数的示例表明,它可以轻松隔离和测试代码,无需实际依赖项或通信。

PHP 函数的依赖注入和服务容器 PHP 函数的依赖注入和服务容器 Apr 27, 2024 pm 01:39 PM

答案:PHP中的依赖注入和服务容器有助于灵活地管理依赖项,提高代码可测试性。依赖注入:通过容器传递依赖项,避免在函数内直接创建,提升灵活性。服务容器:存储依赖项实例,方便在程序中访问,进一步增强松散耦合。实战案例:示例应用程序演示依赖注入和服务容器的实际应用,将依赖项注入到控制器,体现松散耦合优势。

See all articles