将全局变量作为静态类变量访问

时间:2009-11-11 05:40:53

标签: php

假设我有以下课程:

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

我可以简单地打电话:

global $_DATABASE;

在我的函数顶部,但我不想对我的所有静态方法都这样做。有没有办法在我的类中获取一个静态变量来引用全局$ _DATABASE数组?

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

3 个答案:

答案 0 :(得分: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' );
    }
}

答案 1 :(得分: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();
    }
}

话虽如此,使用全局变量通常是代码质量差的一个标志,所以我还建议您考虑采用更加面向对象的方法来处理当前的设计,并寻找可靠的方法来完全消除应用程序中的全局变量

答案 2 :(得分:0)

我不太确定我明白你的意思,抱歉,你能尝试使用static keyword吗?