簡體   English   中英

如何在class :: static var中“安裝”類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM