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