我试图在静态方法中访问全局变量,但我得到了致命错误:
致命错误:在非对象上调用成员函数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
我也试过谷歌但没有运气。请告诉我我做了什么错误,为什么静态变量无法访问它?
答案 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在内部使用了引用,所以你不会浪费任何内存,性能也不会因为这几行额外的代码而下降。
(还有其他原因,关于此的整本书)