我正在建立一个小项目,尽量教自己尽可能多的基础知识,对我而言,意味着不要使用预制框架(As Jeff

once put it,“不要重塑轮子,除非你计划学习更多关于轮子“[重点]),并遵循测试驱动发展的原则。

在我的追求中,我最近遇到了Dependency Injection的概念,这对TDD很重要。我的问题是我不能把我的头围绕着它。到目前为止,我的理解是,它或多或少相当于“让呼叫者通过类/方法可能需要的任何其他类,而不是让他们自己创建”。

我有两个我想用DI解决的示例问题。我在这些重构的正确轨道上吗?

数据库连接

我打算使用单例来处理数据库,因为我目前不希望使用多个数据库。最初,我的模型看起来像这样:

class Post {

private $id;

private $body;

public static function getPostById($id) {

$db = Database::getDB();

$db->query("SELECT...");

//etc.

return new Post($id, $body);

}

public function edit($newBody) {

$db = Database::getDB();

$db->query("UPDATE...");

//etc.

}

}

用DI,我觉得看起来更像这样:

class Post {

private $db; // new member

private $id;

private $body;

public static function getPostById($id, $db) { // new parameter

$db->query("SELECT..."); // uses parameter

//etc.

return new Post($db, $id, $body);

}

public function edit($id, $newBody) {

$this->db->query("UPDATE..."); // uses member

//etc.

}

}

我仍然可以使用单例,使用应用程序设置中指定的凭据,但是我只需要从控制器传递它(控制器无论如何都是无法测试的):

Post::getPostById(123, Database::getDB);

模型调用模型

举个例子,一个有观点的帖子。由于确定视图是否为新的逻辑不是Post对象特有的,所以它只是在自己的对象上成为静态方法。然后Post对象就会调用它:

class Post {

//...

public function addView() {

if (PageView::registerView("post", $this->id) {

$db = Database::getDB();

$db->query("UPDATE..");

$this->viewCount++;

}

}

用DI,我觉得看起来更像这样:

class Post {

private $db;

//...

public function addView($viewRegistry) {

if ($viewRegistry->registerView("post", $this->id, $this->db) {

$this->db->query("UPDATE..");

$this->viewCount++;

}

}

这将调用从控制器更改为:

$post->addView(new PageView());

这意味着实例化一个只有静态方法的类的新实例,这对我来说很不好(我认为在某些语言中是不可能的,但是在这里是可行的,因为PHP不允许类本身是静态的)。

在这种情况下,我们只能深入一层,所以使控制器实例化一切似乎都可行(尽管PageView类通过Post的成员变量间接获取了数据库连接),但是如果你觉得不得不调用一个需要一个需要一个类的类的类的方法。我想这只是意味着这也是一个代码气味。

我正在跟踪这个轨道,还是完全误解了DI?任何批评和建议都不胜感激。

php依赖注入解决什么问题,php – 了解依赖注入的问题相关推荐

  1. SpringBoot构造器注入循环依赖及解决

    1. 循环依赖是什么? Bean A 依赖 B,Bean B 依赖 A这种情况下出现循环依赖. Bean A → Bean B → Bean A 更复杂的间接依赖造成的循环依赖如下. Bean A → ...

  2. Spring中的循环依赖及解决,2021Java精选面试实战总结整理

    那么在创建B类的Bean的过程中,如果B类中存在一个A类的a属性,那么在创建B的Bean的过程中就需要A类对应的Bean,但是,触发B类Bean的创建的条件是A类Bean在创建过程中的依赖注入,所以这 ...

  3. 【简译】关于依赖反转原则、控制反转和依赖注入的抽象的初学者指南

    原文在此. ======================================分割线==================================== 介绍 文章以介绍依赖反转原则开始 ...

  4. Spring IOC 容器源码分析 - 循环依赖的解决办法

    1. 简介 本文,我们来看一下 Spring 是如何解决循环依赖问题的.在本篇文章中,我会首先向大家介绍一下什么是循环依赖.然后,进入源码分析阶段.为了更好的说明 Spring 解决循环依赖的办法,我 ...

  5. spring循环依赖及解决方法

    一.三种循环依赖的情况 ①构造器的循环依赖:这种依赖spring是处理不了的,直接抛出BeanCurrentlylnCreationException异常. ②单例模式下的setter循环依赖:通过& ...

  6. map 循环_被问到Spring循环依赖怎么解决?秀给面试官看!内附图解

    不知道最近有没有被一道Java面试题刷爆朋友圈,Spring框架的循环依赖如何解决.我收到了不少粉丝的提问,在了解到之后,也去网上查询了一些资料,自己也询问了身边的同事,总结出以下几个方面,今天就和我 ...

  7. Spring解决bean之间的循环依赖(循环引用)

    2.概述 bean的实例化仅仅是获得了bean的实例,该bean仍在继续创建之中,之后在该bean实例的基础之上,还要做很多额外的操作,例如bean的属性填充.处理器的应用.bean的循环依赖解决等, ...

  8. 依赖反转原理,IoC容器和依赖注入:第5部分

    目录 介绍 总览 依赖注册 实例注册 工厂注册 类型注册 样例应用程序 总结 介绍 这是我关于依赖反转原理和依赖注入的文章的第五部分也是最后一部分.在上一部分中,我实现了一个自定义容器,其功能非常有限 ...

  9. 依赖反转原理,IoC容器和依赖注入:第4部分

    目录 介绍 背景 LifeTimeOption的实现 总结 下载源代码18.5 KB 介绍 这是我有关依赖反转原理,IoC容器和依赖注入的文章的第四部分.在本文的上半部分,我试图解释如何构建自己的Io ...

最新文章

  1. js 正则表达式奇偶字符串替换_Python中的正则表达式及其常用匹配函数用法简介...
  2. 在.NET中使用脚本引擎
  3. excel公式 某一个单元格等于另一个单元格的值_15个excel小技巧,简单易学,一看就会,收藏备用吧...
  4. curd boy 入门
  5. CSS左中右布局,规范案例
  6. mysql5.1修改登陆密码_mysql 5.1版本 修改密码,及远程登录mysql数据库
  7. html面板插件ui,jQuery布局插件UI Layout简介及使用方法
  8. 外媒:台积电准备明年下半年采用3nm工艺为苹果生产芯片
  9. python基于经纬度距离汇聚点_python实现两个经纬度点之间的距离和方位角
  10. php中smarty扩展类问题
  11. 攀枝花学院计算机专业单身率,重磅 | 攀枝花学院2018届毕业生就业质量年度报告...
  12. 【Unity3D插件】FancyScrollView插件分享《通用UI滑动列表》
  13. 中标麒麟linux界面设置ftp,中标麒麟下sambat和vsftp配置
  14. 查看计算机启动项命令,启动项指令命令有哪些?教你设置电脑Windows开机启动项命令...
  15. 非冯计算机的原理方法,计算机之父 冯诺依曼_非冯诺依曼计算机_冯诺依曼提出的原理(7)...
  16. signature=99d87437cab1487c89a59a65cc379430,剖析根据汉字转拼音的JQuery插件源码
  17. 福特汉姆大学计算机科学专业,福特汉姆大学计算机与信息科学系
  18. c语言很简单只要一节课,计算机二级C语言考什么
  19. MATLAB铁轨检测+异物识别
  20. 激活函数的作用及选择

热门文章

  1. 【Boost】Boost使用几条简单笔记
  2. 浅谈MaxCompute资源规划管理及评估
  3. 基于实时计算Flink的机器学习算法平台及场景介绍
  4. 阿里巴巴HRSSC:用宜搭实现业务管理模式创新
  5. 一小时快速搭建基于阿里云容器服务-Kubernetes的Web应用
  6. 码农节快乐|一个系统,高效解决复杂事件采集-计算-实时触达
  7. 如何完成一次Apache的版本发布
  8. 玩转短视频?守护视频安全?AI智能提速?一分钱体验? 阿里云视频点播大招盘点...
  9. 开源数据库兴起,你需要了解的三件事
  10. 这个数据仓库,竟然把淘宝和京东干翻了。。