我通过PDO访问我的MySQL数据库.我正在设置对数据库的访问权限,我的第一次尝试是使用以下内容:
我想到的第一件事是global:
$db = new PDO('mysql:host=127.0.0.1;dbname=toto', 'root', 'pwd');
function some_function() {
global $db;
$db->query('...');
}
Run Code Online (Sandbox Code Playgroud)
这被认为是一种不好的做法.一点点搜索后,我结束了与Singleton模式,其
"适用于需要单个类实例的情况."
根据手册中的示例,我们应该这样做:
class Database {
private static $instance, $db;
private function __construct(){}
static function singleton() {
if(!isset(self::$instance))
self::$instance = new __CLASS__;
return self:$instance;
}
function get() {
if(!isset(self::$db))
self::$db = new PDO('mysql:host=127.0.0.1;dbname=toto', 'user', 'pwd')
return self::$db;
}
}
function some_function() {
$db = Database::singleton();
$db->get()->query('...');
}
some_function();
Run Code Online (Sandbox Code Playgroud)
当我能做到这一点时,为什么我需要相对较大的课程呢?
class Database {
private static $db;
private function __construct(){}
static function get() …Run Code Online (Sandbox Code Playgroud) 这是一篇由这篇文章组成的通用虚构示例.考虑6个班级
TableFactory, TableData, TableCRUD, TableSchema, DBConnect, Logger.
Run Code Online (Sandbox Code Playgroud)
TableFactory是外部类,假设它拥有TableDataDB表的对象.
在这里TableFactory,没有呼叫TableSchema或DBConnect或logger.我的目标是在外部范围内不需要的内部对象的示例.
TableData是一个内部提取和操作数据,所以它需要TableCrud,DBConnect和Logger.
TableCrud 包含TableSchema和需要DBConnect,和Logger.
DbConnectitseld,为了让事情变得有趣,需要一个Logger.我的例子现在是3个范围深.
我的问题非常简单,如果你有一个对象3(或更多)范围,外部范围内的对象没有调用,那么如何在不破坏接口隔离原则的情况下将这些对象从外部范围发送到内部范围 - > TableFactory shouldn不得不处理内部对象所需的DBConnect或Logger.
如果一个人尊重基本的OOP原则并且目标是易于测试 - >你将需要注入5个对象的外部对象,然后使用getter方法来传递链上需要的对象.而内部范围的对象反过来又要求注入其内部3范围深度对象的依赖关系,并为这些对象注入getter.这使得外部作用域对象需要许多依赖项,而getter只是为了传递它们.
是否有替代这种对象传递方法,我一路上错过了什么?请分享!任何链接/评论赞赏.