」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 存取類別中的資料庫物件時如何避免全域變數?

存取類別中的資料庫物件時如何避免全域變數?

發佈於2024-12-21
瀏覽:790

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);
    }
}

當多種方法有不同的資料庫要求時,這提供了更大的靈活性。

依賴注入的好處

與使用全域變數相比,依賴注入提供了幾個優點:

  • 顯式定義的依賴關係:它使得它明確哪些對象依賴其他對象,消除隱藏的依賴關係。
  • 鬆散耦合:該類別可以輕鬆切換到不同或模擬的資料庫物件以進行測試。
  • 可測試性:單元測試可以只關注類,而不干擾資料庫功能。
  • 擴展性:它允許使用多個資料庫或其他框架而無需進行重大程式碼變更。
最新教學 更多>
  • 如何處理 Java XPath 查詢中的 XML 命名空間?
    如何處理 Java XPath 查詢中的 XML 命名空間?
    Java XPath 查詢中的XML 命名空間處理在Java 中,當使用XPath 查詢XML 時,命名空間可能會帶來挑戰。當 XML 不包含命名空間時,XPath 查詢可以很簡單,但命名空間的存在會帶來複雜性。 情況 1:沒有命名空間的 XML對於沒有命名空間的 XML,XPath查詢使用預設命名...
    程式設計 發佈於2024-12-22
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-12-22
  • Go 1.7 可以在 Windows 上建置 DLL 嗎?
    Go 1.7 可以在 Windows 上建置 DLL 嗎?
    使用Go 1.7 建構dll使用Go 1.7 建構dll在本文中,我們將探討在Windows 下針對Go v1.7 建置dll 的可能性. 問題:有沒有辦法建構一個dll Windows下Go v1.7? 背景:go build -buildmode=shared main.go嘗試使用經典方法建構...
    程式設計 發佈於2024-12-22
  • 如何在 PHP 和 MySQL 中有效處理時區?
    如何在 PHP 和 MySQL 中有效處理時區?
    PHP 和MySQL 中的時區PHP 和MySQL 中的時區將時區系統整合到PHP 應用程式中可能具有挑戰性,但在處理來自不同資料庫的數據時,這一點至關重要時區。這是解決最常見問題並提供實用解決方案的綜合指南。 在MySQL 中儲存日期時間使用DATETIME 或TIMESTAMP: DATETIM...
    程式設計 發佈於2024-12-22
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-12-22
  • 如何有效率地檢索MySQL資料庫中的所有列名?
    如何有效率地檢索MySQL資料庫中的所有列名?
    有效獲取MySQL中所有表的所有列名無需手動即可高效檢索MySQL資料庫中所有表的所有列名select column_name from information_schema.columns where table_schema = 'your_db' order by table_name,ord...
    程式設計 發佈於2024-12-22
  • 如何用Java將URL內容讀入字串?
    如何用Java將URL內容讀入字串?
    使用Java 將URL 內容讀入字串程式設計中的一個常見需求是檢索URL 的內容並將它們儲存為細繩。在Groovy 中,此任務透過簡潔的語法得到簡化:String content = "http://www.google.com".toURL().getText();但是,尋找J...
    程式設計 發佈於2024-12-22
  • 如何在 C++ 中高效複製向量而不使用循環?
    如何在 C++ 中高效複製向量而不使用循環?
    創建向量副本將向量附加到自身時,出於性能原因,最好避免使用循環。 std::vector::insert 函數雖然是一個選項,但不允許使用迭代器*this.用std::copy使用std: :copy 來解決這個問題似乎是一個解決方案,但這種方法可能會導致分段錯誤。 最優解決方案最佳解決方案是同時使...
    程式設計 發佈於2024-12-22
  • 使用 Go 標準庫建立健全的 API:綜合指南
    使用 Go 標準庫建立健全的 API:綜合指南
    作为一名 Go 开发人员,我发现标准库提供了一系列令人印象深刻的工具来构建强大的 API。让我们探索如何利用这些内置包来创建高效且可扩展的 Web 服务。 net/http 包构成了我们 API 开发的基础。它提供了一个简单但功能强大的接口来处理 HTTP 请求和响应。以下是我们如何设置基本服务器:...
    程式設計 發佈於2024-12-22
  • 如何在 CSS 中建立反向邊框半徑效果?
    如何在 CSS 中建立反向邊框半徑效果?
    創建倒置邊框半徑效果創建倒置邊框半徑效果問題:可以倒置邊框半徑嗎達到拐角處出現彎曲的效果向內? 答案:原生 CSS 的 border-radius 屬性不允許使用負值,否則會導致反向效果。不過,這裡有一種使用 CSS 的替代方法:在容器內添加四個附加元素,確保它們稍微超出其邊界。這些元素應該與頁面的...
    程式設計 發佈於2024-12-22
  • MySQL 可以複製 SQL Server 的連結伺服器功能嗎?
    MySQL 可以複製 SQL Server 的連結伺服器功能嗎?
    在 MySQL 中模擬 SQL Server 的連結伺服器功能MySQL 可以用來提供類似 SQL Server 連結伺服器的功能嗎?如果是這樣,如何在 MySQL 5.5 的環境中實現這一點? 解決方案雖然 SQL Server 的連結伺服器允許與不同資料庫進行互通,但 MySQL 的 FEDER...
    程式設計 發佈於2024-12-22
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-12-22
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2024-12-22
  • 插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入記錄時如何解決「一般錯誤:2006 MySQL 伺服器已消失」介紹:將資料插入MySQL 資料庫有時會導致錯誤「一般錯誤:2006 MySQL 伺服器已消失」。當與伺服器的連線遺失時會出現此錯誤,通常是由於 MySQL 配置中的兩個變數之一所致。 解決方案:解決此錯誤的關鍵是調整wait_tim...
    程式設計 發佈於2024-12-22
  • 儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    解決PHP 中的POST 請求故障在提供的程式碼片段中:action=''而非:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"檢查$_POST陣列:表單提交後使用 var_dump 檢查 $_POST 陣列的內...
    程式設計 發佈於2024-12-22

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3