我有一個數據庫類,它用於選擇,更新,刪除MySQL查詢。如何訪問另一個類的對象?
現在,我想在另一個類中創建一個MySQL查詢,但是如果我在index.php
中定義了$db = new DB();
,我不能在另一個類中使用$db
var。如果我想進行查詢,是否必須一遍又一遍地定義變量$db
?或者有沒有辦法使$db
VAR與一個對象的全局變量?
我有一個數據庫類,它用於選擇,更新,刪除MySQL查詢。如何訪問另一個類的對象?
現在,我想在另一個類中創建一個MySQL查詢,但是如果我在index.php
中定義了$db = new DB();
,我不能在另一個類中使用$db
var。如果我想進行查詢,是否必須一遍又一遍地定義變量$db
?或者有沒有辦法使$db
VAR與一個對象的全局變量?
在你index.php
文件使用
require_once('path_to_file_with_class.php');
您也可以使用include_once
,它會給你一個警告而不是錯誤的,如果「path_to_file_with_class.php」文件不可用。
你可以將其定義爲在你的index.php文件全球性的,在類的構造也把$this->db &= $GLOBALS['db'];
你可能需要一個singleton。這使您可以在代碼中的任何位置獲取數據庫實例。然後在任何你想做查詢的地方,首先做$db = DB::getInstance();
。
另一種方法是dependency injection,它將數據庫實例傳遞給所有需要一個的類。
在一個類上定義它(單獨的PHP文件)。然後需要它爲每個需要var的PHP文件。
首先讓你的數據庫類爲singleton。然後在你的新課堂上,你可以做類似:
class myNewClass{
private $_db;
public function __construct(){
$this->_db = DB::getInstance();
}
}
使用魔術功能__autoload()
。
最簡潔的方法是將aggregate數據庫類別所需的injecting它。所有其他方法(如使用global
關鍵字或使用static
方法,更不用說Singleton)正在引入類與全局範圍之間的緊密耦合,這使應用程序難以測試和維護。只要做到
// index.php
$db = new DBClass; // create your DB instance
$foo = new SomeClassUsingDb($db); // inject to using class
和
class SomeClassUsingDb
{
protected $db;
public function __construct($db)
{
$this->db = $db;
}
}
使用Constructor Injection如果需要依賴爲實例創建一個有效的狀態。如果依賴關係是可選的或需要在運行時可互換,則使用Setter Injection,例如,
class SomeClassUsingDb
{
protected $db;
public function setDb($db)
{
$this->db = $db;
}
}
在PHP Singleton模式的例子可以在這裏找到:http://www.weberdev.com/get_example-4002.html – Zilverdistel 2010-09-29 09:03:51
使對象全局可用,你只需要一個靜態方法來初始化它。它不一定是Singleton。兩者都是臭的,所以依賴注入是一條路。 – Gordon 2010-09-29 09:09:55