”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 访问类中的数据库对象时如何避免全局变量?

访问类中的数据库对象时如何避免全局变量?

发布于2024-12-21
浏览:541

How to Avoid Global Variables When Accessing a Database Object within a Class?

在类中使用全局变量

创建分页功能涉及从类中访问数据库对象。但是,尝试访问类内部的外部变量可能会导致错误。让我们深入研究处理此问题的可能解决方案。

为了解决致命错误“在非对象上调用成员函数 query()”,数据库对象需要在类中可访问。不使用全局变量,更合适的方法是将数据库对象注入到类或其方法中。

依赖注入

一种方法是注入数据库对象放入类构造函数中,如下所示:

include_once("pagi.php");

$db = new DB_MySQL("localhost", "root", "", "test"); // connect to the database

$pagination = new Paginator($db);
$records = $pagination->get_records("SELECT * FROM `table`");

class Paginator
{    
    protected $db;

    public function __construct(DB_MySQL $db)
    {
        $this->db = $db;
    }

    public function get_records($q) {
        $x = $this->db->query($q);
        return $this->db->fetch($x);
    }
}

这允许分页类直接访问数据库对象。

方法注入

另一个选项是将数据库对象注入到特定的需要它的方法:

$pagination = new Paginator();
$records = $pagination->get_records("SELECT * FROM `table`", $db);

class Paginator
{
    public function get_records($q, DB_MySQL $db) {
        $x = $db->query($q);
        return $db->fetch($x);
    }
}

当多种方法具有不同的数据库要求时,这提供了更大的灵活性。

依赖注入的好处

与使用全局变量相比,依赖注入提供了几个优点:

  • 显式定义的依赖关系:它使得它明确哪些对象依赖于其他对象,消除隐藏的依赖关系。
  • 松耦合:该类可以轻松切换到不同或模拟的数据库对象以进行测试。
  • 可测试性:单元测试可以只关注类,而不干扰数据库功能。
  • 扩展性:它允许使用多个数据库或其他框架而无需进行重大代码更改。
最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3