2013-04-17 93 views
1

我正在爲PHP預訂系統編寫一個小類。 我自己承認OOP根本就不是我的東西 - 但我想用它來做這個項目,假設我能夠收集足夠的理解來正確使用它。面向對象的PHP和數據庫包裝器

這裏有一些什麼我迄今(主要是僞):

class bookingSystemDbWrapper 
{ 
    public $db; 
    function __construct() 
    { 
     $this->db = mysqli_connect(..., ..., ..., ...);  
    } 
} 

class bookingSystemAvailabilityManager extends bookingSystemDbWrapper 
{ 
    function checkAvailability($date, $roomID) 
    { 
     /** 
     * check availability for a given room on a given date 
     */ 

     $query = mysqli_real_escape_string("SELECT SOMETHING FROM SOMEWHERE"); 
     $result = mysqli_query($this->db, $query); 
     return $result; 
    }   
} 

這種方式工作得很好上方的小和簡單的類。但是當我需要一個創建預訂的類,根據位置等進行搜索時,爲每個類擴展數據庫包裝看起來是個壞主意。所以我需要另一種方法使我的數據庫包裝類可用於其他類,以便它們可以運行數據庫查詢。

我已經閱讀了關於nettuts的依賴注入:http://net.tutsplus.com/tutorials/php/dependency-injection-huh/但它超出了我對OOP的有限理解,所以我不確定要採取什麼方法或如何正確實現它。

TL; DR

我應該怎樣做一個類的公共瓦爾提供給其他類,而不會破壞OOP的任何原則,並保持我的代碼可讀性?

+1

看到http://stackoverflow.com/questions/15323882/is-it-dependency-injection-and-is-it-a-bad-practise/15324725與詳細的解答 –

+0

@catalin類似的問題.costache閱讀,現在它變得更有意義了。感謝您的鏈接 – jammypeach

回答

0

我建議static class,像這樣:

<?php 
class dbms 
    { 
     const HOST  = 'localhost'; 
     const LOGIN = 'login'; 
     const PASSWORD = 'myB!GevU1PwD'; 
     const SCHEMA = 'mydb'; 
     const CHARSET = 'utf8'; 
     const PORT  = 3306; 

     protected static $instance; 

     public static function connect() 
      { 
       if(is_object(static::$instance) && (static::$instance instanceof mysqli)) 
        { return static::$instance->ping(); } 

       static::$instance = new mysqli(static::HOST, static::LOGIN, static::PASSWORD, static::SCHEMA, static::PORT); 

       if(static::$instance->connect_errno)return false; 

       static::set_charset(static::CHARSET); 
      } 

     public static function disconnect() 
      { 
       static::$instance->close(); 

       static::$instance = null; 
      } 

     public static function &getInstance(){ return static::$instance; } 
    } 
?> 

應該是易於擴展,並且隨處可見,你需要:

  1. 只有一個靜態實例共享連接;
  2. 這可能很容易通過extend重新調整用途而不會失去表現;
  3. 它可以從任何你需要的地方訪問,因爲它是一個static class
+0

這使得更有意義,將使我的代碼更清潔 - 非常感謝:) – jammypeach