首页 >数据库 >mysql教程 >在 PHP 类中访问数据库时如何避免全局变量?

在 PHP 类中访问数据库时如何避免全局变量?

Linda Hamilton
Linda Hamilton原创
2025-01-18 00:17:09354浏览

How Can I Avoid Global Variables When Accessing a Database in a PHP Class?

避免在PHP类中访问数据库时使用全局变量

你的代码在尝试访问pagi类方法中的全局变量$db时遇到错误。此错误表明query()方法在一个非对象上被调用,这表明$db变量在类中不可用。

依赖注入解决方案

解决此问题的推荐方法是采用依赖注入,将数据库对象作为参数传递到类中,而不是依赖全局变量。示例如下:

<code class="language-php">$db = new DB_MySQL("localhost", "root", "", "test");
include_once("pagi.php");

$pagination = new Paginator($db);
$records = $pagination->get_records("SELECT * FROM `table`");</code>
<code class="language-php">class Paginator
{
    private $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);
    }
}</code>

在这个例子中,我们创建了一个名为Paginator的新类,它通过构造函数将DB_MySQL对象作为依赖项传入。这将数据库实例注入到类中,使其可用于其中的方法。

依赖注入的优势

使用依赖注入具有以下几个优点:

  • 解耦: 它将类与对DB_MySQL类的直接依赖解耦,使其更灵活,更容易测试。
  • 可测试性: 单元测试变得更容易,因为您可以模拟依赖项并隔离测试类。
  • 避免隐藏依赖项: 与使用global关键字不同,依赖注入清楚地表明该类依赖于特定的依赖项。

其他方法

访问数据库对象的另一种方法是将其直接注入到需要它的方法中,如下所示:

<code class="language-php">$db = new DB_MySQL("localhost", "root", "", "test");
include_once("pagi.php");

$pagination = new Paginator();
$records = $pagination->get_records("SELECT * FROM `table`", $db);</code>
<code class="language-php">class Paginator
{
    public function get_records($q, DB_MySQL $db)
    {
        $x = $db->query($q);
        return $db->fetch($x);
    }
}</code>

但是,通常更倾向于通过构造函数进行依赖注入,因为它提供了更好的封装性和可测试性。

以上是在 PHP 类中访问数据库时如何避免全局变量?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn