本系列的第5部分讨论了测试驱动开发(TDD)。今天,我将讨论依赖性反转,控制反转,依赖性注入以及其他相关主题。

什么是依赖注入?

我们将从依赖注入开始,因为它会引导我们进入其他主题。维基百科告诉我们:在软件工程中,依赖项注入是一种技术,通过该技术,一个对象(或静态方法)可以提供另一个对象的依赖项。

您是否曾经编写过类似以下的代码:<?php

class Superhero

{

public $name;

public function __construct(string $name)

{

$this->name = $name;

}

}

class ComicBook

{

public $mainCharacter;

public function __construct(Superhero $superhero)

{

$this->mainCharacter = $superhero;

}

}

$superhero = new Superhero('Caffeine Man');

$comic = new ComicBook($superhero);

那就是依赖注入的作用。我们的ComicBook对象取决于我们的Superhero对象,因此我们将其注入。得到它?

什么是依赖倒置?

漫画并不总是与超级英雄有关。如果我们想要一本以狗,吸血鬼或吸血鬼狗为主要角色的漫画书怎么办?让我们重新编写代码以允许使用任何类型的字符。<?php

interface CharacterInterface

{

/**

* All classes implementing this interface must provide a getName method.

*/

public function getName() : string;

}

abstract class Character implements CharacterInterface

{

public $name;

public function getName() : string

{

return $this->name;

}

}

class Superhero extends Character

{

public $name;

public function __construct(string $name)

{

$this->name = $name;

}

}

class VampiricDog extends Character

{

public $name;

public function __construct(string $name)

{

$this->name = $name;

}

}

class ComicBook

{

public $mainCharacter;

public function __construct(CharacterInterface $character)

{

$this->mainCharacter = $character;

}

}

$superhero = new Superhero('Caffeine Man');

$superheroComic = new ComicBook($superhero);

var_dump($superheroComic->mainCharacter->getName());

$vampireDog = new VampiricDog('Mr. Fangz');

$vampireComic = new ComicBook($vampireDog);

var_dump($vampireComic->mainCharacter->getName());

因为我们正在编码接口,所以我们现在可以创建任何类型的字符以用于漫画书中。我们已经将角色实现与漫画实现完全脱钩了。想一想–漫画书只想成为漫画书并做漫画书之类的事情。它不在乎您给它什么样的字符,只是知道它需要一个。一旦角色就位,漫画书就可以恢复做漫画书的工作。换句话说:答:高级模块[ComicBook]不应依赖于低级模块[Superhero]。两者都应依赖抽象[CharacterInterface]。

B.抽象不应依赖细节。细节应取决于抽象。

什么是控制反转(IoC)?

控制反转有时也称为“好莱坞定律”。如“不要给我们打电话,我们会给你打电话”。Brett Schuchert使用游戏“大富翁”(Monopoly)来解释这个概念:想象一下由许多参与者创建的垄断系统。游戏协调玩家之间的互动。当需要轮到玩家转弯时,游戏可能会询问玩家是否有任何前动作,例如出售房屋或酒店,然后游戏会根据骰子的掷骰来移动玩家(在真实情况下在这个世界中,物理玩家掷骰子并移动其令牌,但这是棋盘游戏而非计算机的假象-也就是说,这是对正在发生的现象的现象描述,而不是本体论的描述)。请注意,游戏知道何时玩家可以做出决定并相应地提示玩家,而不是由玩家做出决定。

在传统的过程编程中,一个接一个地执行步骤(先执行,然后执行,然后执行)。当一个人转向垄断时,他们就处于控制之中:买酒店。

掷骰子。

移至新地点。

如果计算机控制着游戏,它将看起来像:Computer: Would you like to make a purchase?

Human: I would like to buy a hotel.

Computer: Great, here's your hotel. Do you want to make additional purchases? Human: No.

Computer: Please roll the dice and move to a new spot.

游戏流程完全颠倒了。

什么是IoC容器?

IoC容器有点用词不当。一个更好,更准确的名称是“依赖项注入容器(Dependency Injection Container,DiC)”。这两个术语始终可以互换使用。无论如何,DiC都负责管理对象-从对象的创建方式到配置的方式。框架使用容器在运行时注入依赖项。

这与框架有什么关系?

实际上很多。当您使用框架时,实际上是在赋予它对应用程序的控制权。此外,IoC / DiC容器为大多数框架奠定了基础。我已经开始研究Analyze容器,可以随时关注Github上的进度。完成后,我将深入研究其工作原理和工作方式。

进一步阅读

最后一件事,请务必查看我的新闻通讯!每周,我都会给您发送一封很棒的电子邮件,其中包含更新,重要的链接,技巧和窍门以及其他非开发人员的随机性。如果您有兴趣,可以通过以下链接进行注册。

php 依赖安装顺序6,构建PHP框架:第6部分-依赖倒置,控制倒置,哦,天哪!相关推荐

  1. 前端框架vue3的node安装及项目构建的4种方法

    前端框架vue3的node安装及项目构建的4种方法 C:\Users\Mac\Documents\newlifewyq\技术精英-source\vue\vue3pro>cnpm install ...

  2. 前端UI框架Ant Design Pro 依赖安装

    前端UI框架Ant Design Pro 依赖安装 最近换了新工作,需要负责全栈开发,项目用到的前端框架是ant design, 蚂蚁金服基于react打造的一个服务于企业级产品的UI框架, 这边简单 ...

  3. 通过 DLPack 构建跨框架深度学习编译器

    通过 DLPack 构建跨框架深度学习编译器 深度学习框架,如Tensorflow, PyTorch, and ApacheMxNet,快速原型化和部署深度学习模型提供了强大的工具箱.不幸的是,易用性 ...

  4. DLPack构建跨框架的深度学习编译器

    DLPack构建跨框架的深度学习编译器 Tensorflow,PyTorch和ApacheMxNet等深度学习框架提供了一个功能强大的工具包,可用于快速进行原型设计和部署深度学习模型.易用性通常是以碎 ...

  5. 分布式监控报警平台Centreon之:Centreon依赖安装

    推荐:10年技术力作:<高性能Linux服务器构建实战Ⅱ>全网发行,附试读章节和全书实例源码下载! 一.Centreon依赖安装介绍 Centreon的安装有一定的复杂性,对操作系统库依赖 ...

  6. python spider 安装_Python爬虫(11):Scrapy框架的安装和基本使用

    大家好,本篇文章我们来看一下强大的Python爬虫框架Scrapy.Scrapy是一个使用简单,功能强大的异步爬虫框架,我们先来看看他的安装. Scrapy的安装 Scrapy的安装是很麻烦的,对于一 ...

  7. aptitude安装出现依赖_开发函数计算的正确姿势——依赖安装方法一览

    1. 前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函 ...

  8. 使用Entitas构建游戏框架(一)

    使用Entitas构建游戏框架之Entitas源码解读 前言 一.为什么要ECS 二.Entitas介绍 源码介绍与使用: 1. Component 2. Entity 3. Matcher 4. G ...

  9. 为人所设置的依赖安装程序

    下载InnoDependencyInstaller-master.zip 介绍 Inno Setup Dependency Installer是一组Inno Setup script和一组Pascal ...

  10. [转]Win 2008 R2安装激活、设置优化、可用杀毒软件、常用软件安装顺序与注意事项(三)...

    [转]Win 2008 R2安装激活.设置优化.可用杀毒软件.常用软件安装顺序与注意事项(三) 2011年05月16日 [b]2008R2要用什么杀毒软件?[/b] [b][/b] 找服务器版系统特别 ...

最新文章

  1. PHP学习:PHP超全局变量(Superglobal)$GLOBALS的介绍以及和global的区别
  2. 【设计模式】抽象工厂模式 ( 简介 | 适用场景 | 优缺点 | 产品等级结构和产品族 | 代码示例 )
  3. 静态库与动态库(一):概述
  4. HDU Problem - 4280 Island Transport(最大流)
  5. Hello JavaFX 2.0:命令行介绍
  6. leetcode1085. 最小元素各数位之和 py不止是字符串的神!
  7. 百度BCH云服务器(免费版)SSL证书 - 部署篇
  8. 3.5 訪问者模式(5.11)
  9. 3D中国跳棋 —— 记与子禾童鞋的结对编程(附网站地址及完整源码)
  10. 案例:Oracle dul数据挖掘 没有数据库备份非常规恢复truncate删除的数据表
  11. 【李宏毅2020 ML/DL】P24 Semi-supervised
  12. 端到端--流量控制、可靠传输和滑动窗口机制学习资料整合
  13. win 7 64 安装 tensorflow
  14. centos虚拟机复制后网络重启出错解决
  15. [IT新应用]无线投影技术
  16. 会唱歌的程序员为何如此受欢迎?
  17. Bandizip便携版右键菜单注册
  18. java编程好学么_零基础小白学Java编程好学吗
  19. python中三次方_python中计算三次方怎么表示
  20. 阶乘因式分解(一)/java

热门文章

  1. Mysql将txt文件导入数据库采坑 load data local infile
  2. python程序文件的扩展名是-python脚本文件的扩展名是什么
  3. win7浏览器主页修改不过来_ie主页被锁定无法修改怎么办?ghost win7 ie主页修改不了的两种解决方法...
  4. Java注解(Annotation)
  5. android o bln-al10,华为荣耀BLN-AL10是什么型号
  6. POI excel添加数据有效性验证以及解决DataValidation超长的问题
  7. 越过山丘才发现无人等候 倒计时84
  8. android 自定义动画 相机,Android 自定义view仿微信相机单击拍照长按录视频按钮
  9. 计算机关机打不开,笔记本电脑强制关机打不开了怎么办
  10. 基于树莓派实现简易-智能家居