2015-10-06 72 views
0

即時通訊新的OOP和即將使用簡單的PHP,MySQL包裝類。我無法調用公共函數,它給了我一個錯誤。我無法弄清楚它!PHP的mysql的PDO擴展類錯誤

<?php 
class db extends PDO { 

    private $error; 
    private $sql; 
    private $bind; 
    private $errorCallbackFunction; 
    private $errorMsgFormat; 

    public function __construct($dsn, $user="", $passwd="") { 

     $options = array(
      PDO::ATTR_PERSISTENT => true, 
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 
     ); 

     try { 
      parent::__construct($dsn, $user, $passwd, $options); 
     } 
     catch (PDOException $e) { 
      $this->error = $e->getMessage(); 
     } 
    } 

    public function test() { 
     echo 'whats wrong with this!!!'; 
    } 

} 

$d = new db("mysql:host=127.0.0.1;port=8889;dbname=weddingplan", "root", ""); 
$d->test(); ?> 
我的XAMPP服務器

和結果

Warning: Creating default object from empty value in C:\xampp\htdocs\newwedding\models\class.db.php on line 18

Fatal error: Call to a member function test() on null in C:\xampp\htdocs\newwedding\models\class.db.php on line 32

能否請你TEEL我如何調用公共功能測試?

回答

2

發生了什麼事情錯在這裏的解釋是有點囉嗦,如此忍受我。

在你的子類(DB)的構造函數,你明確地調用父類(PDO)的構造函數:

try { 
    parent::__construct($dsn, $user, $passwd, $options); 

但調用拋出一個異常,你可以捕獲:

} catch (PDOException $e) { 

,然後嘗試設置對象的屬性:

$this->error = $e->getMessage(); 
} 

$this^h沒有被實例化(因爲父構造函數失敗!) - 所以它不再是對當前對象的特殊引用,而是PHP將它視爲任何其他變量(並且嘗試分配給它的error屬性導致PHP實例化改爲\stdClass$this的默認對象);因此非常模糊的警告:

Warning: Creating default object from empty value in C:\xampp\htdocs\newwedding\models\class.db.php on line 18

坦率地說,這種行爲是瘋狂和PHP真正應該做的事情更加理智喜歡在這一點保釋出來,但儘管如此,它前進...

$d = new db("mysql:host=127.0.0.1;port=8889;dbname=weddingplan", "root", ""); 

。 ..但是由於這個嘗試實例化對象失敗,$d爲空。然後試圖調用$d->test()明顯失敗,您看到的錯誤:

Fatal error: Call to a member function test() on null in C:\xampp\htdocs\newwedding\models\class.db.php on line 32

所以,你應該怎麼做來解決它?那麼,你可以調查爲什麼PDO構造函數的調用失敗(可能是不正確的數據庫連接細節)並糾正錯誤;你甚至可以更好地處理異常情況,以便更清楚地傳達這種錯誤;你甚至可以在嘗試實例化後檢查$d的值,以驗證它是否成功...

但是爲什麼子類PDO呢?你可以(並且可能應該)僅僅直接使用它:

$d = new PDO("mysql:host=127.0.0.1;port=8889;dbname=weddingplan", "root", ""); 
+0

PHP試圖紓困。然而,OP不會放過它。 –

+0

感謝您的回答。實際上沒有錯誤,期望數據庫連接端口8889。 –

0

您的示例代碼似乎與您的實際代碼不同,儘管您的測試方法看起來沒有問題。

Warning: Creating default object from empty value in C:\xampp\htdocs\newwedding\models\class.db.php on line 18 

默認的對象是一個沒有構造方法的對象,確保您傳遞參數構造函數和他們應該是什麼(例如,不空!)

Fatal error: Call to a member function test() on null in C:\xampp\htdocs\newwedding\models\class.db.php on line 32 

您的數據庫對象是空的,而不是你認爲的那樣。您無法在空對象上調用方法!

+0

感謝大家的響應 –

+0

請給予好評,並選擇作爲答案,如果它幫助你確定你的代碼的問題。我的答案在eggyal's之前發佈! – user3791372

1

如果您是OOP的新手,爲什麼要創建自己的班級,但沒有足夠的使用其他班級的經驗?它會對你沒有任何好處。 你班上幾乎每一行都是錯的。

相反,學會使用原始PDO。這已經是一堂課,介意你,並不是一件壞事。它可以做比你自己釀造的包裝好的東西。先學習PDO。

-3

替換此行:

parent::__construct($dsn, $user, $passwd, $options); 

有了這個:

new PDO($dsn, $user, $passwd, $options); 
+2

爲什麼?你能解釋一下你的答案的原因,原因和原因嗎? – Martin