[英]how to “install” class inside class::static var
我正在嘗試在類中以靜態方法安裝類
class db extends PDO
{
private static $error;
private static $sql;
private static $bind;
private static $errorCallbackFunction;
private static $errorMsgFormat;
private static $pdo;
public function __construct($dsn = "mysql:host=localhost;dbname=main;",
$user="root", $passwd="")
{
$options = array(
PDO::ATTR_PERSISTENT => true,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
);
try {
self::$pdo = new PDO($dsn, $user, $passwd, $options);
} catch (PDOException $e) {
self::$error = $e->getMessage();
}
}
這是我在私有靜態$ pdo中安裝類的方式,我認為可以做到,但是當我打電話時
public static function run($sql, $bind="")
{
self::$sql = trim($sql);
self::$bind = self::cleanup($bind);
self::$error = "";
try {
$pdostmt = self::$pdo->prepare(self::$sql);
錯誤消息有錯誤
在非對象上調用成員函數prepare()
是否可以在靜態變量內安裝類?感謝您的幫助。
該錯誤意味着self::$pdo
不是對象。 這些都是靜態變量和方法,但是您依賴於實例構造函數來設置PDO實例,因此,如果有人在調用new db(...)
之前調用db::run()
new db(...)
,則該類將無法正常運行。 如果要繼續使用全靜態的類,則需要在調用::run
之前在構造器中進行一些設置。
我建議您嘗試將類用作實例,但是,像這樣:
class DB {
private $error;
private $sql;
private $bind;
private $errorCallbackFunction;
private $errorMsgFormat;
private $pdo;
public function __construct($dsn = "mysql:host=localhost;dbname=main;", $user="root", $passwd=""){
$options = array(
PDO::ATTR_PERSISTENT => true,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
);
try {
$this->pdo = new PDO($dsn, $user, $passwd, $options);
} catch (PDOException $e) {
$this->error = $e->getMessage();
}
}
public function run($sql, $bind = ''){
$this->sql = trim($sql);
$this->bind = self::cleanup($bind);
$this->error = "";
try {
if(!isset($this->pdo)){
throw new \RuntimeException('No PDO instance');
}
$pdostmt = $this->pdo->prepare(self::$sql);
...
}
}
您將需要跟蹤該類的實例,但是通過這種方式,您不必擔心處於未構造/實例化的狀態。
同樣,在您的示例中,您正在擴展基本PDO類。 擴展內部PHP類通常是一種危險的做法,並且鑒於您正在構建看起來像包裝器而不是PDO類擴展的東西,因此似乎沒有任何理由這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.