首页 >数据库 >mysql教程 >如何使用依赖注入避免'在非对象上调用成员函数 query()”错误?

如何使用依赖注入避免'在非对象上调用成员函数 query()”错误?

Patricia Arquette
Patricia Arquette原创
2025-01-18 00:23:11922浏览

How to Avoid

避免类方法中的全局变量:分页示例

构建分页功能时,您可能会遇到错误“调用非对象上的成员函数 query()”。这通常源于从类本身内部访问类外部声明的变量。 让我们探索更好的解决方案。

依赖注入:首选方法

依赖注入提供了一个干净的解决方案。 我们不依赖全局变量,而是将必要的对象(如数据库连接)直接传递给类。 这是通过构造函数完成的:

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

$pagination = new Paginator($db);
$records = $pagination->get_records("SELECT the, fields, you, want, to retrieve 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);
    }
}</code>

方法注入:替代方案

或者,您可以将数据库对象直接注入到需要它的方法中:

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

$pagination = new Paginator();
$records = $pagination->get_records("SELECT the, fields, you, want, to retrieve FROM `table`", $db);

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

为什么依赖注入更优越

依赖注入比使用全局变量具有显着的优势:

  • 显式依赖:代码清楚地展示了每个类所依赖的内容,提高了可读性和可维护性。
  • 松散耦合:类没有与特定实现紧密绑定。 您可以轻松交换数据库系统或其他依赖项,而无需更改核心类逻辑。
  • 可测试性:单元测试变得更加简单。 您可以在测试期间轻松模拟依赖关系,隔离被测类。

总之,依赖注入是管理依赖项和共享资源、促进更干净、更健壮和可测试的代码的最佳实践。 采用这种方法可以避免全局变量的陷阱。

以上是如何使用依赖注入避免'在非对象上调用成员函数 query()”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

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