2011-11-02 84 views
1

我正在尋找一種自動生成類的方法。例如,目前我的每個類都是在一個單獨的文件中定義的,php __autoload():自動生成類

class book{ 

    public $name; 
    public $isbn; 
    public $id; 
} 

然後我也有每個類的數據類。數據類繼承了一個很好的數據映射器。所以,如果想裝入一本書的$ id = 2,我會做到以下幾點:

$bookData = new bookData; 
$book = $bookData->find(2); 

$本書將是書類的草簽版本,並具有其所有屬性設置爲他們在相應的DB 。

現在,我所做的是使用__autoload($ className)自動包含我的類文件。我想使它不必創建類文件。

目前,這是我想出:

__autoload($className){ 

    if(file_exists('classes/'.$className.'.php')){ 

     include 'classes/'.$className.'.php'; 
    }else{ 

     //Go to DB, find table with $className and Get all column names 
     //Use fopen() to create a new file (like the book class file above) 
     //Use the coloumns from DB as vars for this new file.. 
     //fclose() file and include new file... 
    } 
} 

以上,我認爲是相當混亂,但。有關如何更輕鬆地完成此任務的任何建議?例如,使用__autoload()來生成標準類,並使用從數據庫獲取的屬性名並返回它,而不必創建新文件?

在此先感謝

回答

1

我不認爲你需要創建一個新的文件。你所尋找的東西看起來非常類似於非常漂亮的RedBean library(for ORM)中的「beans」。

如果我是你,我會怎麼做,是不要在autoloader中創建類。我會創建一個名爲Data的泛型類。

然後,你可以這樣做:

$bookData = new Data('book'); 

然後Data類中,你將有,抓住從數據庫中的數據程序,並將它們應用到類(假設你有一個包含數據的數組):

foreach ($data as $key => $value){ 
    $this->$key = $value; 
} 

您還可以設置在data對象類型:

public function __construct($type){ 
    $this->type = $type; 
} 

這樣,您可以輕鬆地知道該數據類的實例引用了哪些「類型」(或數據庫表)。

如果「圖書」對象具有與「圖書」有關的特殊功能,那麼您需要創建一個擴展爲Data的類。這是不可避免的,因爲一些點在你需要插入的地方的價格計算方法:

class BookData extends Data(){ 

    public function calculatePrice(){ 
     //return calculated price 
    } 
} 

另一種方法是編寫抓取您的數據庫和前手爲您生成的類的腳本。顯然,缺點是您需要在每次更改數據庫結構時運行此腳本來重新生成類。

+0

非常有趣!感謝phpdev,我想我會按照你提到的第一種方式去做。如果我這樣做的話,一些類可能是例外的,例如他們可能需要額外的方法作爲他們類的一部分。例如,book類可能包含一個calculatePrice()方法......關於新數據對象如何處理這些內容的任何建議? – user1020317

+0

我編輯了我的答案以顯示如何實現「calculatePrice()」。 – F21

+0

+1提到RedBeans。 –