代码之家  ›  专栏  ›  技术社区  ›  Mike Trpcic

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

php
  •  3
  • Mike Trpcic  · 技术社区  · 15 年前

    假设我有以下课程:

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

    我可以打电话给:

    global $_DATABASE;
    

    在函数的顶部,但我不想对所有静态方法都这样做。有没有一种方法可以让类内的静态变量引用全局$_数据库数组?

    编辑:我不能在构造函数中分配它,因为这都是静态的,并且从未调用构造函数。

    3 回复  |  直到 15 年前
        1
  •  2
  •   Jon Benedicto    15 年前

    您可以使用超级全局数组 $_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' );
        }
    }
    
        2
  •  2
  •   Noah Goodrich    15 年前

    如果疼的话,你很可能 做错了。

    首先,如果看不到更多的代码,就不可能提供更具体的解决方案,但是我强烈建议您考虑重新排列类结构,以便静态函数(听起来您有一长串要实现的函数)成为非静态的。

    本质上,您应该考虑访问一个已实例化的sqlmapper实例,然后从该实例调用适当的方法。使用这个范例,您可以为$_数据库实例化一个类级属性,然后类中的所有方法都可以自由引用该属性。

    例如:

    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();
        }
    }
    

    尽管如此,使用globals通常是代码质量不佳的标志,因此我也建议您考虑对当前设计采用更面向对象的方法,并寻找从应用程序中彻底消除globals的可靠方法。

        3
  •  0
  •   Jorge Israel Peña    15 年前

    我不太确定我明白你的意思,对不起,但是你能试着用一下吗? static keyword 是吗?