2009-11-11 91 views
3

比方说,我有下面的类:访问全局变量为静态类变量

class SQLMapper{ 
    static find_user_by_id($id){ 
     //sql logic here, using the $_DATABASE global to make a connection 
    } 
} 

我可以简单地叫:

global $_DATABASE; 

在我的函数的顶部,但我不希望为我所有的静态方法做到这一点。有没有办法让我的类内的静态变量引用全局$ _DATABASE数组?

编辑:我不能在构造函数中分配它,因为这是全部静态的,并且构造函数永远不会被调用。

+0

为什么这一切都必须是静态的? – 2009-11-11 05:53:37

回答

2

您可以使用超全局阵列$_GLOBALS来访问您的$_DATABASE变量。例如:

query($GLOBALS['_DATABASE'], 'some query'); 

或者,写一个静态函数返回变量的内容:

class SQLMapper 
{ 
    static function getDatabase() 
    { 
     global $_DATABASE; 
     return $_DATABASE; 
    } 

    static function find_user_by_id($id) 
    { 
     query(self::getDatabase(), 'some query'); 
    } 
} 
0

我不太确定我明白你的意思,对不起,但你可以尝试使用static keyword

+1

这会比答案做出更好的评论。 – 2012-07-05 14:46:28

2

如果它伤害,它可能是你 做错了。

首先,没有看到更多的代码的其无法提供更具体的解决办法,但我强烈建议您考虑重新安排你的类结构,使你的静态功能(这听起来像你已经有了一个他们要实施的长列表)变得非静态。

实质上,您应该考虑访问SQLMapper的实例化实例,然后从实例中调用适当的方法。使用这个范例,你可以为$ _DATABASE实例化一个类级别的属性,然后可以被该类中的所有方法自由引用。

例如:

class SQLMapper { 

    private $_db; 

    public function __construct() 
    { 
     global $_DATABASE; 

     $this->_db = $_DATABASE; 
    } 

    public function find_user_by_id($id) { 

     $sql = "Select * from User WHERE Id = ?"; 

     $stmt = $this->_db->prepare($sql, $id); 

     return $stmt->execute(); 
    } 
} 

随着中说,使用全局变量一般是代码的低质量的标志,所以我也建议你考虑采取更多的面向对象的方法,以当前的设计和寻找尝试和真正的方法来从你的应用程序中完全消除全局变量。