避免在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中文网其他相关文章!