【问题标题】:Including a global variable in a PHP object在 PHP 对象中包含全局变量
【发布时间】:2013-10-10 18:09:36
【问题描述】:

希望这是一个直截了当的问题:

我正在寻找创建一个类,并且我想在其中包含我的数据库变量 ($mysql),以便我可以进行数据库交互。到目前为止,我一直在将其设为全局内部函数,但我希望不是在每个类函数中全局包含变量,而是有一些方法可以简单地将它包含到类中/在类中访问它。我不太擅长范围界定。

我能想到的唯一选择是创建一个类变量并在构造函数中全局包含该变量并将其分配(可能通过引用,这有意义吗?)给类变量。

还有其他选择吗?

【问题讨论】:

  • 创建一个类属性来保存数据库对象,在构造函数中传递,是一种常见且很好的解决方案,比全局调用要好得多。对象在 PHP 中默认通过引用分配。
  • 谢谢迈克尔,我怀疑这可能是答案。被给予,将其设为私人罚款吗?或者这更适合作为静态对象?
  • 私有很好,如果您在类中有其他静态方法需要访问实例上下文之外的数据库,则可能需要private static。但在这种情况下,您还没有调用构造函数,因此您需要某种init() 方法来设置静态属性。不过,如果您只打算在实例上下文中使用它,请不要担心。
  • 这是有道理的。是的,它仅在实例的上下文中;我已经有了 DB 对象,我只需要使用它。

标签: php class scope


【解决方案1】:

我为我的数据库处理编写了这个类,也许它对你有点用:

<?php
    class Database {
        public $mysqli;

        function __construct() {
            $this->connect();
        }

        function __wakeup() {
            $this->connect();
        }

        function connect() {
            $mysqli = new mysqli(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DB);
            if ($mysqli->connect_error) {
                die('Connect Error (' . $mysqli->conect_errno . ')'
                    . $mysqli->connect_error);
            }
            mysqli_set_charset($mysqli, 'utf8');
            $this->mysqli = $mysqli;
        }   

        function queryDB($query) {
            $result = $this->mysqli->query($query);

            if ($this->mysqli->error) {
                error_log("QUERY ERROR: " .$this->mysqli->error);
                error_log("QUERY: " . $query);
            }
            return $result;
        }
    }
?>

【讨论】:

  • 我做了一个类似的类供我使用。我做的另一件事是声明 connection 方法以及 $mysqli 属性为静态的。这允许类在所有实例之间共享连接,而不是在每次实例化类时都重新连接。
  • 对不起,我想你误解了我的问题,或者我误解了你的回答。我已经有一个 PDO 实例来处理我的数据库。我正在创建一个不同的类来处理特定的数据集,并且我希望能够直接使用该 PDO 实例而不是建立新的连接,因此我想弄清楚如何包含它。
  • @RhoVisions 如果你像我说的那样做,新实例不会在每次实例化时重新连接到数据库。除此之外,您将不得不使用某种“依赖注入”,这只是“将类的实例作为参数传递给方法/函数。或者传递给将其存储为内部属性。”
  • 好吧,对不起,我弄错了。难道你不能将你的其他类扩展到 Datebase 类,并使用 parent:: 函数访问实例吗?也许这是一个选择?
  • Jonathan:我不担心重新连接,因为我已经有一个活动连接。你答案的后半部分是我所倾向于的:将全局变量包含到对象中的最佳方法是什么。