php __autoload():自动生成类

时间:2011-11-02 23:36:50

标签: php oop

我正在寻找一种自动生成类的方法。例如,目前我的每个类都在一个单独的文件中定义;

class book{

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

然后我还为每个类都有一个数据类。数据类继承了一个非常有效的数据映射器。因此,如果我想加载$ id = 2的图书,我会执行以下操作:

$bookData = new bookData;
$book = $bookData->find(2);
$ book将是book类的初始版本,并且其所有属性都设置为相应的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()生成一个标准类,从DB获取属性名并返回它,而不必创建新文件?

提前致谢

2 个答案:

答案 0 :(得分:1)

我认为您不需要创建新文件。您正在寻找的内容与非常好的RedBean library(对于ORM)中的“bean”非常相似。

如果我是你,我会怎么做,就是不要在autoloader中创建课程。我会创建一个名为Data的泛型类。

然后你可以做类似的事情:

$bookData = new Data('book');

然后在Data类中,您将拥有从数据库中获取数据的例程,并将它们应用于类(假设您有一个包含数据的数组):

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

您还可以在data对象中设置类型:

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

这样,您可以轻松地告诉数据类实例引用的“类型”(或数据库表)。

如果“book”对象具有与“books”相关的特殊功能,那么您需要创建一个扩展Data的类。这是不可避免的,因为在某些时候你需要在某处插入计算价格方法:

class BookData extends Data(){

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

另一种方法是编写一个脚本来抓取您的数据库并为您预先生成类。显然,缺点是每次更改数据库结构时都需要运行此脚本来重新生成类。

答案 1 :(得分:0)

我从来没有这样做但是,也许你说,为了一个好的搜索你正在搞乱工厂 =>班级工厂。

http://en.wikipedia.org/wiki/Factory_method_pattern

希望它有所帮助...