当前位置: 首页 > 面试题库 >

是否存在用PHP访问数据库的单例的用例?

戎鹏云
2023-03-14
问题内容

我通过PDO访问我的MySQL数据库。我正在设置对数据库的访问权限,而我的第一个尝试是使用以下内容:

我想到的第一件事是global

$db = new PDO('mysql:host=127.0.0.1;dbname=toto', 'root', 'pwd');

function some_function() {
    global $db;
    $db->query('...');
}

这被认为是不好的做法。稍作搜索后,我得到了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();

为什么我需要这个相对较大的班级?

class Database {
    private static $db;

    private function __construct(){}

    static 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() {
    Database::get()->query('...');
}

some_function();

最后一个效果很好,我不必担心$db了。

如何创建较小的单例类,或者在PHP中缺少单例的用例?


问题答案:

好的,当我刚开始我的职业生涯时,我想了一下。以不同的方式实现它,并提出了两个选择不使用静态类的理由,但它们是相当大的。

一种是,您会发现很多时候,您绝对可以确定自己永远不会有一个以上的实例,最终您会拥有另一个实例。您可能最终会得到第二个监视器,第二个数据库,第二个服务器(无论如何)。

When this happens, if you have used a static class you’re in for a much worse
refactor than if you had used a singleton. A singleton is an iffy pattern in
itself, but it converts fairly easily to an intelligent factory pattern–can
even be converted to use dependency injection without too much trouble. For
instance, if your singleton is gotten through getInstance(), you can pretty
easily change that to getInstance(databaseName) and allow for multiple
databases–no other code changes.


第二个问题是测试(老实说,这与第一个问题相同)。有时您想用模拟数据库替换数据库。实际上,这是数据库对象的第二个实例。使用静态类比单例要困难得多,您只需要模拟getInstance()方法,而不是模拟静态类中的每个方法(在某些语言中可能会非常困难)。

这实际上归结为习惯-当人们说“ Globals”很糟糕时,他们有很好的理由这么说,但是在您亲自解决问题之前,它可能并不总是显而易见的。

您可以做的最好的事情是(像您一样)提出问题,然后做出选择并观察决策的后果。与一开始就正确地掌握代码的知识相比,掌握随着时间的推移来解释代码演变的知识更为重要。



 类似资料:
  • 问题内容: 我通过PDO访问我的MySQL数据库。我正在设置对数据库的访问,而我的第一次尝试是使用以下内容: 我想到的第一件事是: 这被认为是不好的做法。稍作搜索后,我得到了Singleton模式,该模式 “适用于需要一个类的单个实例的情况。” 根据手册中的示例,我们应该这样做: 为什么我需要这个相对较大的课程? 最后一个效果很好,我不必担心了。 如何创建较小的单例类,或者在PHP中缺少单例的用例

  • 本文向大家介绍Rxjava2_Flowable_Sqlite_Android数据库访问实例,包括了Rxjava2_Flowable_Sqlite_Android数据库访问实例的使用技巧和注意事项,需要的朋友参考一下 一、使用Rxjava访问数据库的优点: 1.随意的线程控制,数据库操作在一个线程,返回数据处理在ui线程 2.随时订阅和取消订阅,而不必再使用回调函数 3.对读取的数据用rxjava进

  • 本文向大家介绍PHP判断数据库中的记录是否存在的方法,包括了PHP判断数据库中的记录是否存在的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP判断数据库中的记录是否存在的方法。分享给大家供大家参考。 具体实现代码如下: 希望本文所述对大家的PHP程序设计有所帮助。

  • 本文向大家介绍实例讲解php数据访问,包括了实例讲解php数据访问的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了两种php数据访问方式,大家可以进行比较,分析两种方式的异同,最后为大家提供了一个小练习,具体内容如下 方式一:已过时,只做了解 1.造一个连接(建立通道) $db=mysql_connect("localhost","root","123");     //括号内是“服

  • 问题内容: 我有一组HTML文件和一个SQLite数据库,我想使用file://方案从浏览器访问这些数据库。是否可以使用JavaScript访问数据库并创建查询(和表)? 问题答案: 不好的是,浏览器对它的支持非常有限。 这里更多信息HTML5索引,网络SQL数据库和浏览器大战 PS:正如@Christoph所说,WebSQL不再处于主动维护状态,并且Web应用程序工作组不打算进一步维护它,因此。

  • 问题内容: 我是PHP和SQL领域的一名新开发人员。到目前为止,我只完成了Objective- C编程。但是,我的一个项目要求我拥有一个在线数据库,我需要从我的应用程序访问该数据库。我打算使用该框架来远程访问数据库,如下所示: 但这是行不通的,因为我联系了我的托管服务提供商,并且他们已经对其进行了设置,因此我无法从外部主机访问我的数据库(出于安全性考虑)。因此,我将不得不寻找替代方案。我唯一想到的