2016-05-12 51 views
1

問候好人,如果對象沒有實例,調用靜態函數返回NULL? PHP OOP

我最近遇到一些與OOP有關的問題。首先,我正在尋找從頭創建CRUD Db類。這是一個代碼:

class Database{ 

    public static $link; 
    public $message; 
     public function __construct() { 

     try { 
      self::$link = mysqli_connect(HOST, USER, PASS, DB); 

      if (!self::$link) { 
       echo self::$link->error; 
      } 


     } catch (Exception $e) { 
      die(" Failed connecting to DB") ; 
     } 
    } 

    public static function query($SQL){ 

     return self::$link->query($SQL); 

    } 
     public static function select($table, array $columns){ 
     $columns=implode(",",$columns); 
     $result=self::query("SELECT $columns FROM $table"); 


     return self::$link->fetch($result); 
    } 

} 

所以,問題是這樣的:

如果我把我的靜態選擇功能是這樣的:

Database::select('users', array('username'=>'user')); 

它返回:致命錯誤:調用一個成員函數查詢()在一個非對象.. 如果我調試這樣的連接:var_dump(Database::$link)返回NULL 但如果我把「$ DB =新的數據庫();」在該線以上,它的工作原理?

誰能教我什麼,我做錯了什麼?

謝謝!

+0

我沒有注意到:(HOST,USER,PASS,DB)是從另一個文件包含常數。 – fugitive

回答

1

要調用一個靜態方法。因此,對象不會被實例化。所以,__construct()方法不會調用。這意味着$link屬性將不會被填充。

不管你做什麼,你需要連接到你的數據庫。您可以調用靜態方法connect()將連接到數據庫,並填充$link,或確保在每一個需要的連接方法,即建立連接:

public static function connect() 
{ 
    try { 
     self::$link = mysqli_connect(HOST, USER, PASS, DB); 
     if (!self::$link) { 
      echo self::$link->error; 
     } 
    } catch (Exception $e) { 
     die(" Failed connecting to DB") ; 
    } 
} 

public function select(SQL) 
{ 
    if (!static::$link) { 
     static::connect(); 
    } 

    // your stuff 

} 

這是您想了解一件好事。在處理這樣的特定項目之前,您需要熟悉OOP:構造函數/析構函數,訪問器,增變器,靜態方法等等。這很重要,因爲它是所有您接下來要做的事情的基礎。

+0

這只是一個問題,出於很多 –

+0

你能指出問題嗎? @YourCommonSense – fugitive

+0

@YourCommonSense我明白,MilosM想學習。這裏的主要問題不是數據庫的使用,而是理解OOP的原則。 – Arcesilas