- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
事实证明,从 C#/C++ 迁移到 PHP OOP 有点问题,因为我不确定以相同方式设计代码布局是否是标准。既然如此,我很好奇当涉及到 PHP 时,以下内容是否会被认为是有问题或错误的。
然而,最有问题的问题是从 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
类可能是PDO
或MySQLi
或您想要使用的任何数据库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/
我刚开始使用 Dagger 2,想知道与我目前用来实现依赖注入(inject)的技术相比,它有什么优势。 目前,为了实现 DI,我创建了一个具有两种风格的项目:mock 和 prod。在这些风格中,我
我是一名优秀的程序员,十分优秀!