在STATIC方法中访问全局变量


Access GLOBAL variable in STATIC Method

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

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

意味着我的静态变量不能容纳全局变量,但是这个标准适用于普通方法(没有static)。

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

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

如果您从未实例化过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);
    }
}

…或者远离静态方法,在实例中注入适当的需求。

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

您可以通过构造函数给出$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在内部使用引用,你不会浪费任何内存,性能也不会因为这几行额外的代码而下降。

(还有其他原因,整本书都是关于这个的)

相关文章: