从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
类可能是PDO
或MySQLi
或您要使用的任何数据库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
希望这可以使事情有所清除。