php依赖注入解决什么问题,php – 了解依赖注入的问题

我正在建立一个小项目,尽量教自己尽可能多的基础知识,对我而言,意味着不要使用预制框架(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?任何批评和建议都不胜感激。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/519222.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图片批量转换pdf文件

文章目录1. 依赖2. 工具类抽取1. 依赖 <!--图片转换pdf Start--><!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version&g…

对话阿里云Alex Chen:下一代存储应如何面对云转型?

数字经济"乘云而上"。 十年前&#xff0c;阿里云开始自主研发云计算操作系统飞天之路&#xff0c;开启了中国云时代&#xff1b; 十年后&#xff0c;阿里云在中国市场份额超过2-8名总和&#xff0c;培育了整个中国云计算市场&#xff0c;数字经济在云上蓬勃发展。 …

写给大数据从业者:数据科学的5个陷阱与缺陷

来源 | AI 前线作者 | 陈炬&#xff0c;责编 | Carol出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;导读&#xff1a; 这篇分享主要总结了数据从业人员在实践中可能遇到的陷阱与缺陷。跟其他新起的行业一样&#xff0c;数据科学从业人员需要不停的去考虑现…

winform php 交互,WinForm开发,窗体显示和窗体传值

以前对WinForm窗体显示和窗体间传值了解不是很清楚最近做了一些WinForm开发,把用到的相关知识整理如下A.WinForm中窗体显示显示窗体可以有以下2种方法&#xff1a;Form.ShowDialog方法 (窗体显示为模式窗体)Form.Show方法 (窗体显示为无模式窗体)2者具体区别如下&#xff1a;1.…

阿里云数据库自研产品亮相国际顶级会议ICDE 推动云原生数据库成为行业标准

4月9日&#xff0c;澳门当地时间下午4:00-5:30&#xff0c;阿里云在ICDE 2019举办了主题为“云时代的数据库”的专场分享研讨会。 本次专场研讨会由阿里巴巴集团副总裁、高级研究员&#xff0c;阿里云智能数据库产品事业部负责人李飞飞&#xff08;花名&#xff1a;飞刀&#…

常用git

常用git #在此分支基础上创建test分支&#xff0c;并切换到test 注&#xff1a;本分值的以前提交记录会保存 git checkout -b test #在此分支基础上创建uat分支&#xff0c;并切换到uat 注&#xff1a;本分值的以前提交记录会保存 git checkout -b uat #将本地的uat分支推送…

springboot Java实现多文件的zip压缩操作 + 通过浏览器下载文件的两种方式

注只适配utf-8的场景&#xff0c;待完善&#xff01; 压缩为zip文件 通过java程序输出文件 /*** 功能:压缩多个文件成一个zip文件* param srcfile&#xff1a;源文件列表* param zipfile&#xff1a;压缩后的文件*/ public static void zipFiles(File[] srcfile, File zipfil…

大神如何一招完美解决Hadoop集群无法正常关闭的问题!| 博文精选

来源 | CSDN 博客作者 | Alice菌&#xff0c;责编 | Carol出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;相信对于大部分的大数据初学者来说&#xff0c;一定遇见过Hadoop集群无法正常关闭的情况。有时候当我们更改了Hadoop内组件的配置文件后&#xff0c;…

oracle怎么查语句消耗时常,Oracle 查找常见耗性能的语句

-- 最耗缓存SELECT * FROM (SELECT SQL_FULLTEXT sql,buffer_gets, executions, buffer_gets/executions "Gets/Exec",hash_value,address,LAST_ACTIVE_TIMEFROM V$SQLAREAWHERE buffer_gets > 10000ORDER BY buffer_gets DESC)WHERE rownum < 10 ;-- 最多物理…

现代IM系统中的消息系统架构 - 架构篇

前言 IM全称是『Instant Messaging』&#xff0c;中文名是即时通讯。在这个高度信息化的移动互联网时代&#xff0c;生活中IM类产品已经成为必备品&#xff0c;比较有名的如钉钉、微信、QQ等以IM为核心功能的产品。当然目前微信已经成长为一个生态型产品&#xff0c;但其核心功…

ORA-12505, TNS:listener does not currently know of SID given in connect descriptor

ORA-12505: TNS: 监听程序当前无法识别连接描述符中所给出的SID 给程序配置新的数据库的时候&#xff0c;出现了以下错误 ORA-12505, TNS:listener does not currently know of SID given in connect descriptor说明给到的sid有误,很有可能就是服务名和sid混淆使用。 首先了解…

华南地区最大数据中心上线 阿里云河源数据中心正式开服

2月18日&#xff0c;阿里云在官网宣布&#xff0c;河源数据中心正式对外提供服务。这是华南地区规模最大的绿色数据中心&#xff0c;可容纳超过30万台服务器&#xff0c;作为深圳地域的新可用区为华南地区上百万企业客户提供领先的云计算、人工智能、物联网等服务。 据悉&#…

在阿里做了五年技术主管,我有话想说

阿里妹导读&#xff1a;在历史文章《如何成为优秀的技术主管&#xff1f;》中&#xff0c;阿里巴巴高级技术专家云狄从开发规范、开发流程、技术规划与管理三个角度&#xff0c;分享对技术 TL 的理解与思考。 今天的文章&#xff0c;他将继续深入探讨这一话题&#xff0c;从管理…

oracle删除查询的数据库语句,Oracle简略的语句 查询 删除 修改(1)

Oracle简单的语句 查询 删除 修改(1)Dual系统表介绍数据类型&#xff1a;数据是信息数字表现形式,信息的加工处理是以大量的结构化数据为载体进行的,数据库管理系统的核心是数据库,数据库的主要对象是表,表是结构化数据存储的地方.Oracle系统也提供了大量的数据类型主要包括两大…

Fish Redux中的Dispatch是怎么实现的?

零.前言 我们在使用fish-redux构建应用的时候&#xff0c;界面代码&#xff08;view&#xff09;和事件的处理逻辑&#xff08;reducer&#xff0c;effect&#xff09;是完全解耦的&#xff0c;界面需要处理事件的时候将action分发给对应的事件处理逻辑去进行处理&#xff0c;…

装载服务器安装和配置_一站式解决方案

文章目录一、安装搭建篇1.1. 安装ORACLE客户端1.2. 安装LFTP1.3. 安装DBI和DBD&#xff08;1.4. 将应用包导入数据加载服务器1.5. 数据库账号密码加密策略二、进阶篇2.1. 数据库操作2.2. 加载器操作2.3. 数据库连接2.4. 模型变更2.5. 装载数据到目标表2.6. 装载特殊场景三、特色…

码上用它开始Flutter混合开发——FlutterBoost

开源地址: https://github.com/alibaba/flutter_boost为什么需要混合方案 具有一定规模的App通常有一套成熟通用的基础库&#xff0c;尤其是阿里系App&#xff0c;一般需要依赖很多体系内的基础库。那么使用Flutter重新从头开发App的成本和风险都较高。所以在Native App进行渐…

Linux系统常用指令总结

来源 | CSDN 博客作者 | 不撸代码闲得慌&#xff0c;责编 | Carol出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;系统的运行级别0&#xff1a;关机1&#xff1a;单用户模式&#xff08;可以找回丢失的密码&#xff09;2&#xff1a;多用户状态没有网络服务…

在php中调用java接口吗,php 调用 java 接口

php 需要开启 curl模块/** HTTP 请求函数封装*/function http_request_cloudzone($url, $data){//var_dump($url."test");if(!$url){return "";}$ch curl_init ();curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); //禁用证书curl_setopt($ch, CURLOPT_…

像数据科学家一样思考:12步指南(下)

第三阶段-完成 一旦产品构建完成&#xff0c;你仍然需要做一些事情来使项目更加成功并使你的未来生活更轻松。那么我们如何完成数据科学项目呢&#xff1f; 10-交付产品 完成阶段的第一步是产品交付。为了创建可以交付给客户的有效产品&#xff0c;首先必须了解客户的观点。其…