2011-11-02 82 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。 –