我试图在静态方法中访问全局变量,但我得到致命错误:
致命错误:在非对象上调用成员函数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在内部使用引用,你不会浪费任何内存,性能也不会因为这几行额外的代码而下降。
(还有其他原因,整本书都是关于这个的)