2012-12-15 31 views
0

我試圖建立一個微小的ORM類車型將延伸,從而,例如,如果我稱之爲User::find(1)它會給我富人的1id在數據庫中的「用戶」模型的方法。微小的ORM問題PHP

這是我的嘗試:

class ORM 
{ 
    private static $table, $database; 

    function __construct() { 
     self::getConnection(); 
    } 

    private static function getConnection(){ 
     require_once('Database.php'); 
     error_log('Getting connection'); 
     self::$database = Database::getConnection(DB_PROVIDER, DB_HOST, DB_USER, DB_PASSWORD, DB_DB); 
    } 

    public static function find($id) { 
     $obj = null; 
     self::getConnection(); 
     $query = "SELECT * FROM ? WHERE id = ?"; 
     $results = self::$database->execute($query,null,array(self::$table,$id)); 
     print_r(); 
     if ($results){ 
      $obj = new self($results); 
     } 
     return $obj; 
    } 
} 

然後,例如類User

include('ORM.php'); 
include('../../config.php'); 

class User extends ORM 
{ 
    public $id, $name; 
    private static $table = 'user'; 

    public function __construct($data){ 
     parent::__construct(); 
     if ($data && sizeof($data)) { $this->populateFromRow($data); } 
    } 

    public function populateFromRow($data){ 
     $this->id = isset($data['id']) ? intval($data['id']) : null; 
     $this->name = isset($data['name']) ? $data['name'] : null; 
    } 
} 

print_r(User::find(1)); 

我把那些包括和print_r只是爲了測試,它不會留在那裏之後。

問題是,看起來方法find沒有從類中讀取$table,它不會讀取任何內容。所以查詢不能很好地執行,只會返回一個錯誤。

我在做什麼錯?

+1

另一種解決方案是不使用靜態方法和成員。這樣做的好處是您可以真正測試代碼,並且更靈活。 – hakre

回答

0

將代碼中的self更改爲static。請注意,它只能在php> = 5.3中使用。 Read more about late static binding

+0

你好,謝謝你,但這個錯誤出現'不能訪問私有財產用戶:: $表中的26行/inc/class/ORM.php'它沒有意義,使我的財產公開,雖然應該沒有問題。 –

+0

它應該被「保護」,可用於繼承類 –

+0

這似乎是正確的!謝謝! –