gpt4 book ai didi

php - 对象的管理器类

转载 作者:行者123 更新时间:2023-11-29 13:17:30 25 4
gpt4 key购买 nike

事实证明,从 C#/C++ 迁移到 PHP OOP 有点问题,因为我不确定以相同方式设计代码布局是否是标准。既然如此,我很好奇当涉及到 PHP 时,以下内容是否会被认为是有问题或错误的。

  • CDeviceManager 类(1 个启动)
  • CDevice 类
  • 在 CDeviceManager 类中保留 CDevice 的私有(private)数组
  • 使用公共(public)方法获取设备、搜索设备等。

然而,最有问题的问题是从 MySQL 数据库填充每个 CDevice。将我的数据库类直接包含到 CDeviceManager 中并在 CDeviceManager 构造中填充 CDevice 数组是否安全?

我读到的很多内容都说将业务逻辑与 View 分开是明智的,我觉得这个方法就可以做到这一点。不过,我还没有看到许多其他项目似乎使用这种方法,所以我担心我可能会错过一些东西。

最佳答案

最好将业务逻辑与数据存储系统分开。我建议使用依赖注入(inject)来完成你的工作。确切的实现将取决于您的需求(和项目规模),但为了获得一个想法,我会做:

class CDeviceManager
{
private $db; //holder for your database
private $cdevices = array();
//more properties here

public function __construct(Database $db)
{
$this->db = $db; //database connection has now been injected into your class
}

//more methods here
}

然后,当您创建 CDeviceManager 对象时,您可以注入(inject)数据库连接。

$cdm = new CDeviceManager( new Database(...) );

您的Database类可能是PDOMySQLi或您想要使用的任何数据库API的包装器。您还可以更进一步,让 CDeviceManager 实现某种与数据库中的各种 CRUD 函数相关的接口(interface)。不过,最好的部分是,您可以更轻松地测试它,因为现在您可以将数据库连接替换为模拟/测试数据库,这样您就不会无意中搞砸生产数据库。

$cdm = new CDeviceManager( new MockDatabase(...) );

$testdb = new TestDatabase(...);
$cdm = new CDeviceManager( $testdb );

所以,是的,最终最好将数据库连接与域模型分开。有些人建议更进一步,确保您的域模型完全不了解一般的存储机制,这样您就可以在存储系统/持久层上保持灵 active 。例如:

$cdm = new CDeviceManager( new FileRetriever() );  //Maybe you are storing stuff in a flat file

希望这有助于澄清一些事情。

关于php - 对象的管理器类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21283020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com