php 依赖安装顺序6,构建PHP框架:第6部分-依赖倒置,控制倒置,哦,天哪!
本系列的第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部分-依赖倒置,控制倒置,哦,天哪!相关推荐
- 前端框架vue3的node安装及项目构建的4种方法
前端框架vue3的node安装及项目构建的4种方法 C:\Users\Mac\Documents\newlifewyq\技术精英-source\vue\vue3pro>cnpm install ...
- 前端UI框架Ant Design Pro 依赖安装
前端UI框架Ant Design Pro 依赖安装 最近换了新工作,需要负责全栈开发,项目用到的前端框架是ant design, 蚂蚁金服基于react打造的一个服务于企业级产品的UI框架, 这边简单 ...
- 通过 DLPack 构建跨框架深度学习编译器
通过 DLPack 构建跨框架深度学习编译器 深度学习框架,如Tensorflow, PyTorch, and ApacheMxNet,快速原型化和部署深度学习模型提供了强大的工具箱.不幸的是,易用性 ...
- DLPack构建跨框架的深度学习编译器
DLPack构建跨框架的深度学习编译器 Tensorflow,PyTorch和ApacheMxNet等深度学习框架提供了一个功能强大的工具包,可用于快速进行原型设计和部署深度学习模型.易用性通常是以碎 ...
- 分布式监控报警平台Centreon之:Centreon依赖安装
推荐:10年技术力作:<高性能Linux服务器构建实战Ⅱ>全网发行,附试读章节和全书实例源码下载! 一.Centreon依赖安装介绍 Centreon的安装有一定的复杂性,对操作系统库依赖 ...
- python spider 安装_Python爬虫(11):Scrapy框架的安装和基本使用
大家好,本篇文章我们来看一下强大的Python爬虫框架Scrapy.Scrapy是一个使用简单,功能强大的异步爬虫框架,我们先来看看他的安装. Scrapy的安装 Scrapy的安装是很麻烦的,对于一 ...
- aptitude安装出现依赖_开发函数计算的正确姿势——依赖安装方法一览
1. 前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函 ...
- 使用Entitas构建游戏框架(一)
使用Entitas构建游戏框架之Entitas源码解读 前言 一.为什么要ECS 二.Entitas介绍 源码介绍与使用: 1. Component 2. Entity 3. Matcher 4. G ...
- 为人所设置的依赖安装程序
下载InnoDependencyInstaller-master.zip 介绍 Inno Setup Dependency Installer是一组Inno Setup script和一组Pascal ...
- [转]Win 2008 R2安装激活、设置优化、可用杀毒软件、常用软件安装顺序与注意事项(三)...
[转]Win 2008 R2安装激活.设置优化.可用杀毒软件.常用软件安装顺序与注意事项(三) 2011年05月16日 [b]2008R2要用什么杀毒软件?[/b] [b][/b] 找服务器版系统特别 ...
最新文章
- PHP学习:PHP超全局变量(Superglobal)$GLOBALS的介绍以及和global的区别
- 【设计模式】抽象工厂模式 ( 简介 | 适用场景 | 优缺点 | 产品等级结构和产品族 | 代码示例 )
- 静态库与动态库(一):概述
- HDU Problem - 4280 Island Transport(最大流)
- Hello JavaFX 2.0:命令行介绍
- leetcode1085. 最小元素各数位之和 py不止是字符串的神!
- 百度BCH云服务器(免费版)SSL证书 - 部署篇
- 3.5 訪问者模式(5.11)
- 3D中国跳棋 —— 记与子禾童鞋的结对编程(附网站地址及完整源码)
- 案例:Oracle dul数据挖掘 没有数据库备份非常规恢复truncate删除的数据表
- 【李宏毅2020 ML/DL】P24 Semi-supervised
- 端到端--流量控制、可靠传输和滑动窗口机制学习资料整合
- win 7 64 安装 tensorflow
- centos虚拟机复制后网络重启出错解决
- [IT新应用]无线投影技术
- 会唱歌的程序员为何如此受欢迎?
- Bandizip便携版右键菜单注册
- java编程好学么_零基础小白学Java编程好学吗
- python中三次方_python中计算三次方怎么表示
- 阶乘因式分解(一)/java
热门文章
- Mysql将txt文件导入数据库采坑 load data local infile
- python程序文件的扩展名是-python脚本文件的扩展名是什么
- win7浏览器主页修改不过来_ie主页被锁定无法修改怎么办?ghost win7 ie主页修改不了的两种解决方法...
- Java注解(Annotation)
- android o bln-al10,华为荣耀BLN-AL10是什么型号
- POI excel添加数据有效性验证以及解决DataValidation超长的问题
- 越过山丘才发现无人等候 倒计时84
- android 自定义动画 相机,Android 自定义view仿微信相机单击拍照长按录视频按钮
- 计算机关机打不开,笔记本电脑强制关机打不开了怎么办
- 基于树莓派实现简易-智能家居