依赖注入简单实现

2023-12-12

看完之后this我想知道是否有人可以帮助我理解如何使用这些 PHP 类正确实现依赖注入:

class DBClass
{
    private $mMysqli;
    function  __construct(mysqli $database)
    {
        $this->mMysqli=$database;
    }
    function __destruct()
    {
        $this->mMysqli->close();
    }

    public function listUsers()
    {
        $query='SELECT * FROM Utente;';
        $resultset=$this->mMysqli->query($query);
        while($row = $resultset->fetch_array(MYSQLI_ASSOC)) {
            echo $row['username'];
            echo $row['pwd'];
            echo "<br />\n";
        }

    }

    public function runQuery($query)
    {
        return $resultset=$this->mMysqli->query($query);
    }

    public function getConnection()
    {
        return $this->mMysqli;
    }
}

会话类:

class Session
{
    private $_session;
    public $maxTime;
    private $database;

    public function __construct(DBClass $database)
    {
        $this->database=$database;
        $this->maxTime['access'] = time();
        $this->maxTime['gc'] = get_cfg_var('session.gc_maxlifetime');
        session_set_save_handler(array($this,'_open'),
                array($this,'_close'),
                array($this,'_read'),
                array($this,'_write'),
                array($this,'_destroy'),
                array($this,'_clean')
                );
        register_shutdown_function('session_write_close');
        session_start();
        ...
     }
}   

用户类别(有关当前登录用户的详细信息):

class User
{
    private $username;
    private $role;
    private $session;

    function __construct($session)
    {
        $this->session=$session;
        ...
    }
}

外部:

$connection=new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_DATABASE);
$database=new DBClass($connection);
$session=new Session($database);
$user=new User($session);

这是正确的方法吗?


是的。您现在通过构造函数注入依赖项,从而减少耦合。您现在可以更轻松地交换这些依赖项,例如当进行单元测试时,你可以用 Mock 替换它们。

不过,通过使用具体的 DBClass 作为 TypeHint 而不是界面。因此,当您想要使用不同的 DBClass 时,必须将其命名为 DBClass。您可以通过以下方式实现更松散的耦合针对接口进行编码具体类必须改为实现。

要仅创建类的单个实例(如评论中所要求的),您可以使用单例(如 Kevin Peno 建议的)或工厂来创建并跟踪实例是否已创建。或者使用 DI 服务容器,它类似于工厂,但不是同一件事。它为您创建和管理对象。

The Symfony 组件库有一个依赖注入容器提供了关于如何使用服务容器进一步增强 DI 的优秀文档和主题介绍。容器还可以用于限制实例。一探究竟。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

依赖注入简单实现 的相关文章

  • 永久铸造到超类

    If class Car Automobile 我可以 Car toyota new Car Automobile tauto Automobile toyota 但如果我这样做tauto GetType Name仍然会是Car 是否可以执
  • 如何通过键查找最大和最小日期

    我有一个数组 a array 2010 05 03 gt 100 2010 05 04 gt 400 2008 05 01 gt 800 2011 01 01 gt 800 我如何找到最大值和最小值key date 例如 max gt 20
  • PHP/MySQL:检索邻接列表模型中的单个路径

    有没有什么有效的方法可以在不限制深度的情况下根据节点的ID检索邻接列表模型中的单个路径 就像如果我有一个名为 Banana 的节点的 ID 我可以获得以下路径 Food gt Fruits gt Banana 如果不可能的话也不是什么大问题
  • mongodb对话系统

    我正在实施一个verymongodb 上的简单对话系统 这个想法应该是 当我打开一个 convo 时 它应该显示发送和接收的消息 到目前为止一切正常 并且应该非常容易 通过使用像这样的伪代码这样的简单查询 from my id AND to
  • xdebug_start_trace 行为异常

    我正在尝试进一步减少脚本内存使用量 我试图让我的脚本使用 xdebug 生成输出来分析内存使用情况 这是一个基于 CLI 的脚本 有 shebang usr local bin php q 我向它传递一个参数并检查它 argc gt 1 i
  • 用于存储和检索每个用户敏感数据的.Net 设计模式

    Net 服务器应用程序是否有与存储和检索敏感的每个用户信息 例如第 3 方凭据 相关的参考模式 我的初步设计思路是 生成具有适当强私钥的自签名 X509 证书 导出证书和密钥并将其存储在 USB 密钥中 该 USB 密钥将被锁在宝箱中并由龙
  • MySQL 中如何使用继承?

    所以我正在读一本关于数据库设计原理的书 并读到了有关继承的章节 但我对如何在 MySQL 中将子类与其超类 连接 感到困惑 The table structure would for example look like this 那么我如何
  • 将异步调用变成同步调用

    将异步调用转变为同步有什么好的实践 模式 吗 我有一个第三方库 它的方法都是异步的 要获得几乎任何方法的结果 您必须侦听事件 这将带来一些上下文 基本上它看起来像 service BeginSomething service OnBegin
  • C++ - 模板类中模板函数的单独声明/定义

    我知道在标头中声明模板类方法并在源文件中定义它的语法如下 myclass h template
  • Propel Query 中的动态表名称

    我想知道您是否可以使 propel 查询的表名称动态化 有点像变量 一个例子类似于 DynamicVar Query create 我让它在 ifs 中工作 就像下面的例子一样 但如果更动态地制作 可以删除相当多的行 这些表的设置都是相同的
  • php,in_array,0值

    我试图理解in array下一个场景的行为 arr array 2 gt Bye 52 77 3 gt Hey var dump in array 0 arr 返回值in array 是布尔值true 正如你所看到的no值等于0 所以有人可
  • 如何使用 PDO 动态构建查询

    我正在使用 PDO 并想做这样的事情 query dbh gt prepare SELECT FROM table WHERE column value query gt bindParam table tableName query gt
  • 转换MAC地址格式

    我刚刚编写了一个小脚本 从交换机中提取数百个 MAC 地址进行比较 但它们的格式为 0025 9073 3014 而不是标准的 00 25 90 73 30 14 我对如何转换它感到困惑 我能想到的最好的办法就是在 处将它们分解成碎片 然后
  • $_SESSION 中保存大量信息可以吗?

    我需要存储许多数组 SESSION以防止从 MySQL 检索信息 可以吗 其中 太多 的信息有多少 SESSION还是没有 太多 谢谢 附 或者更好地使用http php net manual en book memcache php ht
  • PHP 中的嵌套 JSON 输出

    我正在为 iOS 应用程序构建 API 并尝试将 mySQL 数据转换为 JSON 字符串进行处理 所需的输出将需要顶级订单详细信息 例如客户名称和地址 然后是订购的产品子数组 我需要的两个表中有相当多的字段 我希望拥有所有字段 我已经构建
  • 如何显示不同页眉的页面? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在为我的学校项目开发网站 但我遇到了一个问题 我在每个页面上显示一个标题 我的标题之一包含登录表单 另一标题包含用户名 搜索栏等 问题是
  • PHP - 查找和比较日期

    你好 我有 foreach 我可以在其中获取数据库中的事件数据 我使用数据库中的日期名称 例如 event date 我需要在一个 div 中比较具有相同日期和输出的操作 例如我有这个事件 活动一 9 月 13 日 活动二 9 月 1 日
  • PHP 除法浮点值问题

    当我尝试获取余数时 它给出了无效值 我试图获得两位小数的余数 我得到 3 4694469519536E 18 我的价值观是 x 0 1 y 0 005 我尝试了以下方法 echo ed fmod 0 1 0 005 OutPut 3 469
  • Laravel 5 注销特定用户

    在我的 laravel 5 应用程序中 有一个功能允许具有管理员角色的用户重置非管理员的任何人的密码 但这不会强制该人注销并再次登录 更改密码后如何强制用户注销 我没有对用于验证用户身份或任何内容的中间件进行任何更改 我不知道它是否有效 但
  • 哪个 PHP 5 版本最常用?

    当我开发将在不同配置的客户端 Web 服务 通常使用共享托管 上使用的应用程序时 我应该假设大多数 Web 服务器都具有哪个 PHP 5 版本 例如 5 2 x 5 3 x 等 在所有使用 PHP 版本 5 的网站中 有 84 9 使用版本

随机推荐

  • 有没有办法使用 PayPal REST API 设置定期付款?

    I read 这个问题 and this one 他们 一年前 都表示 通过 REST API 进行定期付款正在开发中 在我客户的网站上 客户需要能够支付 全额 一次性支付 例如 退房时 1200 美元 分期付款 6 个月内 1200 美元
  • LNK2038:检测到“RuntimeLibrary”与 cuda 不匹配

    我正在使用 Visual Studio 2013 编译包含 cpp 和 cu 文件的动态库 在链接过程中出现以下错误 proj generated cufile cu obj error LNK2038 mismatch detected
  • 使用 scala.math.max 减少浮点数组

    我对以下行为感到困惑 为什么使用 math max 减少 Int 数组可以工作 但 Float 数组需要包装函数 我记得这在 2 9 中不是问题 但我对此并不完全确定 scala version Scala code runner vers
  • Android - 重新启动活动而无需重新创建它

    我有一个显示图像的活动 ViewCollection java 我只想创建它一次 然后重新使用该实例来进一步显示来自不同调用的更多图像 该活动的初始化成本很高 到目前为止 我发起的活动是这样的 Intent i new Intent thi
  • 矢量化代码的 GPU 优化

    function w oja X varargin get the dimensionality m n size X random initial weights w randn m 1 options struct rate 00005
  • 实体集合的 IList 与 IEnumerable

    当我的域中存在包含事物列表的实体时 它们是否应该公开为 IList 或 IEnumerable 例如 Order 有一堆 OrderLines IEnumerable
  • Google 地图标记标题不再显示为悬停时的工具提示

    The 谷歌地图文档表示添加一个title当用户将鼠标悬停在该标记上时 标记对象的属性将导致其值显示为工具提示 这曾经工作得很好 包括在 API 的 v3 中 但在过去几个月的某个时候它已经停止工作了 包括在简单标记示例文档中提供 我在 C
  • IPython:如何自动加载 npz 文件并为变量赋值?

    我是 Python 新手 我热切地从 MATLAB 迁移到 IPython 作为我在实验室进行数据分析的首选语言 在 MATLAB 中 经过一段数据处理后 我会这样做 gt gt gt save myresults mat x y z 并将
  • 在 iOS 中加载数千个数据和放大时间时,MapView 会冻结几秒钟

    我正在开发Mapview用快捷的语言 因为 我正在将 geojson 文件加载到我的地图视图中 它加载成功 我正在加载GEOSwift图书馆 它工作正常 但是 发生了什么 在加载数据时 地图视图在 UI 中冻结 卡住几秒钟 然后显示数据 即
  • Notepad++ 用增量值查找/替换数字

    是否可以在Notepad 中找到一个数字 然后将其替换为增量值 例如 查找身份证号码 regex d INSERT INTO wp make id name slug VALUES 0 audi audi INSERT INTO wp ma
  • CopiesList.addAll 方法抛出 UnsupportedOperationException

    List
  • Mysql 查询用于选择 varchar 字段中的最小/最大值

    所以我有一个 varchar 列 它应该存储产品价格 不要问我最后是如何得到的 但现在我没有选择更改这个 叹气 它也可以是空白的 或包含一个文本 字面意思 null OUT 其中两者都代表价格 0 查找此列的 MIN 和 MAX 值的最佳和
  • 进度条 C#

    我有一个进度条来显示程序将歌曲加载到库中的状态 foreach Song s in InitializeLibrary Library AddSong s pBar Value pBar Update InitializeLibrary 只
  • 如何从打字稿中的json响应获取日期对象

    这是我的 json data comment 3541 datetime 2016 01 01 这是模型 export class Job constructor comment string datetime Date this comm
  • 为什么空数组可以有非空维度? [复制]

    这个问题在这里已经有答案了 例如 如果我们写 x int8 empty 0 5 whos x输出 Name Size Bytes Class Attributes x 0x5 0 int8 这样 我们就得到了一个0x5类的空数组int8 如
  • 为什么 Kafka Streams 强制对 GlobalKTable 状态存储禁用日志记录?

    为什么全局表不能在 kafka 中启用日志记录 code if loggingEnabled throw new TopologyException StateStore storeName for global table must no
  • 更改 cubism.js 中的默认比例

    我正在使用 cubism js 来绘制 JSON 对象中的一些静态数据 我们希望能够显示一年的数据 每天都有一个点 我的解决方案部分工作 但我希望能够独立于今天的日期设置比例 即我想绘制从昨天到去年相应日期的数据图表 我尝试了以下方法但没有
  • 如何在没有命令或事件的情况下发送消息discord.py

    我正在使用日期时间文件来打印 现在是早上 7 点 每天早上 7 点 现在因为这超出了命令或事件引用 所以我不知道如何以不和谐的方式发送一条消息说现在是早上 7 点 不过需要澄清的是 这不是一个警报 它实际上是针对我的学校服务器的 它会在早上
  • 收据对齐无法快速正常工作

    我目前正在根据我的数据打印收据 当我打印收据时 对齐数据无法正常工作 我认为我应该将开始索引和结束索引应用于字符串 因为我的产品名称长度不同 所以我应用此代码来检查字符串的长度 这是收据的屏幕截图 你可以看到收据对齐是错误的 这是我的代码
  • 依赖注入简单实现

    看完之后this我想知道是否有人可以帮助我理解如何使用这些 PHP 类正确实现依赖注入 class DBClass private mMysqli function construct mysqli database this gt mMy