2010-09-15 85 views
1

使用以下爲例(與$ DB是一個先前創建的數據庫連接對象)...「超全局對象」

Class Session { 
    function write_log() { 
    global $db; 
    $db->query(...); 
    } 
} 

有沒有一種方法,以避免編寫「全球$ DB」每次我想在另一個類中使用$ db對象?換句話說,從一開始就宣佈$ db對象爲超全局。

+0

相關:http://stackoverflow.com/questions/1812472/in-a-php-project-如何組織和訪問你的幫助對象 – 2010-09-15 21:00:07

+0

[從類和腳本訪問全局對象(如數據庫或日誌)的最佳方式?](http://stackoverflow.com/questions/1967548/best-way-to-access-global-objects-like-database-or-log-from-classes-and-scripts) – Wrikken 2010-09-15 21:07:25

回答

6

傳遞$db在類的構造函數:

class Session { 
    function __construct($db) { 
     $this->db = $db; 
    } 

    function write_log() { 
     $this->db->query(...); 
    } 
} 

裏調用:

$session = new Session($db); 
+2

這是正確的方法......使用全局變量將使你的代碼變得不可讀,不可維護,幾個月或幾年後你可用... – hacksteak25 2010-09-15 20:49:54

4

Superglobals是一組特定的內置PHP所提供的變量,這些變量的任何地方訪問,而無需聲明爲global

$GLOBALS 
$_SERVER 
$_GET 
$_POST 
$_FILES 
$_COOKIE 
$_SESSION 
$_REQUEST 
$_ENV 

一般來說,不可能創建自己的超全球。

你可以一個$db成員然而添加到您的Session類,並參考$this->db代替:

class Session 
{ 
    public $db; 

    function __construct() 
    { 
    $this->db = ... // set up $db object 
    // ... 
    } 

    function write_log() 
    { 
    $this->db->query(...); 
    } 
} 
+0

+1用於解釋超全域用戶 – 2010-09-15 20:50:22

+0

它可以創建自己的超全局用戶(http://www.php.net/manual/en/runkit.configuration.php)。但是,人們不應該這樣做。 – Wrikken 2010-09-15 20:55:38

+0

@Wrikken夠公平的,我沒有意識到這一點。 – 2010-09-15 20:59:51