从C#/ C ++到PHP OOP的迁移已证明有点问题,因为我不确定以相同的方式设计代码布局是否是标准的。在这种情况下,我很好奇以下问题在涉及PHP时是否被认为是有问题的还是错误的。


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


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

我读过的很多文章都说,将业务逻辑与视图分开是很明智的,我认为这种方法可以做到这一点。但是,我还没有看到其他许多项目似乎都在使用这种方法,为什么我担心自己可能会遗漏一些东西。

最佳答案

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

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对象时,可以在一行中的某个位置插入数据库连接。

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


您的Database类可能是PDOMySQLi或您要使用的任何数据库API的包装。您还可以更进一步,让CDeviceManager实现某种与数据库中各种CRUD功能相关的接口。最好的部分是,您可以更轻松地进行测试,因为现在您可以将数据库连接与模拟/测试数据库交换出去,因此您不会无意间破坏了生产数据库。

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


要么

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


因此,是的,最后最好将数据库连接与域模型分开。有些人建议走得更远,并确保您的域模型通常对存储机制完全不了解,这样您就可以在存储系统/持久层上保持灵活性。例如:

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


希望这可以使事情有所清除。

10-01 03:22