【问题标题】:Set $mysqli as a global variable for OOP将 $mysqli 设置为 OOP 的全局变量
【发布时间】:2017-06-21 06:34:13
【问题描述】:

好的, 这是一个涉及的问题,但任何帮助或建议将不胜感激。

所以我正在使用一个网站(使用.htaccess)将所有流量重定向到load.php。对于任何sql 功能,我都有一个抽象类,它有很多查询语句作为函数,它们传递参数来定义每个查询的细节。

例如 $table->update("约束")

我试图弄清楚如何在load.php 上设置与数据库的连接,然后将连接设置为一个变量($mysqli),然后可以在我的抽象查询类中引用它而无需通过每个查询函数调用的参数。

再次感谢任何帮助或建议。

这是一个函数的例子:

 function clearTable (){
    $mysqli = dbConnect::connect();
    $sql = "TRUNCATE TABLE $this->tablename";
    $mysqli->query($sql);

}

如果我在构造函数中连接到数据库并设置$this->mysqli 并将$mysqli = dbConnect::connect(); 替换为$mysqli = $this->mysqli,则所有查询都不起作用。尽管他们在每次通话时都会重新连接。

【问题讨论】:

  • function __construct($conn) { $this->$mysqli = $conn; } 然后在你的函数中使用$this->$mysqliphp.net/manual/en/language.oop5.decon.php
  • 一些代码可能有助于获得更好的答案。
  • 我刚刚尝试过,但没有成功。想法?
  • 你做错了。向我们展示您是如何尝试实现这一点的,我们也许可以帮助您纠正它。
  • 更新问题

标签: php mysql oop mysqli


【解决方案1】:

您应该为此使用依赖注入。

基本上这意味着需要数据库连接的类不创建连接,它只是接收已经实例化的实例。

示例

在一些初始化文件中:

// Create the db connection
$db = new Mysqli(......);

// Pass it to the query class that needs it
$queryClass = new QueryClass($db);

然后在你的类文件中:

class QueryClass
{
    protected $db;

    public function __construct($db)
    {
        // $this->db will now be the same Mysql instance
        $this->db = $db;
    }

    public function doSomeQuery()
    {
        $this->db->query(....);
    }
}

这样做的好处是,如果您想开始进行一些单元测试,您不需要接触 QueryClass。您只需将数据库连接传递给测试数据库即可。

【讨论】:

    【解决方案2】:

    再看一遍之后,我还可以创建我的db::connect() 函数,如下所示:

    class dbConnect {
        private static $db;
        private $mysqli;
        private function __construct() {
            $this->mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE);
        }
        function __destruct() {
            $this->mysqli->close();
        }
        public static function connect() {
            if (self::$db == null) {
                self::$db = new dbConnect();
            }
            return self::$db->mysqli;
        }
    } 
    

    并将其作为$this->mysqli 传递到查询函数文件中

    【讨论】:

    • 如何创建数据库连接并不重要,只要您仍然将 mysqli 实例传递给需要它的类即可。如果您要从其他类调用 dbConnect::connect(),则您已经建立了硬依赖,这被认为是不好的做法,因为您无法在不更改类实现的情况下更改数据库连接。
    • 那是有道理的。类实现不应该不那么通用和更专业(因此,如果您需要更改数据库连接,无论如何都需要更改)?我想,在我看来,它应该看起来像 db.config.php 被输入到 db.connect.php 到 sql.function.php 中。在那种情况下,您实际上只会为新项目接触 db.config,并将 sql.function.php 扩展为每次使用的新实例...
    • 您已经掌握了主要思想。 :) 尽管如此,通常情况下,您会将 db 配置发送到 db 类(如您所说),因此如果您想通过另一个连接重用您的 db 类,则只需要使用另一个 conf。如果方法相同,则无需扩展它,只需使用另一个conf。您应该查看 IoC 容器和接口。这将帮助您解决所有这些问题。 :)
    • 非常感谢您的帮助。谢谢!
    猜你喜欢
    • 2017-04-03
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    相关资源
    最近更新 更多