2010-09-15 84 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