在STATIC方法中访问GLOBAL变量

时间:2014-06-12 11:35:06

标签: php static-methods

我试图在静态方法中访问全局变量,但我得到了致命错误:

  

致命错误:在非对象上调用成员函数prepare()

表示我的静态变量不能保存全局​​变量,但此标准适用于普通方法(无静态)。

class Payment_Handler {


    private static $dbh;


    function __construct() { 
        global $dbh;

        self::$dbh = $dbh;
    }



    /**
     * Verify Secret Key
     * 
     * @param string $secret_key
     * @return boolean
     */
    static function verify_secret( $secret_key ) {
         // Do the stuff with self::$dbh
         $query = "............";
         $stmt = self::$dbh->prepare($query);
    }
} // End Class

我也试过谷歌但没有运气。请告诉我我做了什么错误,为什么静态变量无法访问它?

2 个答案:

答案 0 :(得分:2)

如果您从未实例化过Payment_Handler对象,那么它确实是NULL。我写了一个包装函数,而不是直接使用self::$dbh

class Payment_Handler {
    private static $dbh;
    function __construct() { 
        global $dbh;
        self::$dbh = $dbh;
    }
    static function getDBH(){
       if(is_nul(self::$dbh)) self::$dbh = $GLOBALS['dbh'];
       return self::$dbh;
    }
    static function verify_secret( $secret_key ) {
         $query = "............";
         $stmt = self::getDBH()->prepare($query);
    }
}

...或远离静态方法,并在实例中注入适当的要求。

答案 1 :(得分:1)

使用全局变量总是一个坏主意,使用静态变量通常是一个坏主意。

您可以通过构造函数提供$ dbh对象以避免全局变量:

class Payment_Handler {
    private $dbh;

    public function __construct($dbh){
        $this->dbh = $dbh;
    }

    public function verify_secret( $secret_key ) {
        $query = "............";
        $stmt = $this->dbh->prepare($query);
    }
}

甚至更好,使用某种依赖注入

class Payment_Handler {
    private $dbh;

    public function __construct(){}

    public function setConnector($dbh){
        $this->dbh = $dbh;
    }

    public function verify_secret( $secret_key ) {
        $query = "............";
        $stmt = $this->dbh->prepare($query);
    }
}    

为什么全局变量不好?

  • 安全问题。您的变量(数据库更糟)可以从任何地方访问
  • 国家不受控制。代码的其他部分可以在您不知道的情况下更改变量
  • 测试。模仿全球性的东西是非常困难的

为什么静态不好?

  • 测试。模仿全球性的东西是非常困难的

那些“好”的样品有缺点吗?

不是因为PHP在内部使用了引用,所以你不会浪费任何内存,性能也不会因为这几行额外的代码而下降。

(还有其他原因,关于此的整本书)