php - 对象的管理器类

标签 php mysql class oop subclass

事实证明,从 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/

相关文章:

php - 条件 mySQL 语句。如果为真 UPDATE,如果为假 INSERT

mysql - 海量sql删除查询

c++ - 变量可以调用私有(private)函数吗?

javascript - AppleScript 和 JavaScript : Getting all data from HTML row

php - LONG POLLING(在 php 中)在对数据库发出 5 次请求后开始挂起

php - 创建匹配数字范围的正则表达式的函数

php获取具有特定键值的对象的数组索引

mysql - 计算百分比但出现语法错误

php - 在php/mysql中生成随机字符串

c++ - C++程序类中的cout