使用PDO,__ call和preg_match自动创建访问器方法

时间:2010-11-14 01:25:42

标签: php sql oop

我开始研究自动创建数据库访问器的方法。我正在寻找与PHP> = 5.2兼容的东西。我的第一次尝试导致了这个问题:

class FancyPDOBase extends PDO{
///////////////////////////////////////////////////////////////////////////////
////Magic
///////////////////////////////////////////////////////////////////////////////
    public function __call($method, $args){
        if(preg_match('/get[A-Z]{1}[a-z_]*[A-Z]{1}[a-z_]*By[A-Z]{1}[a-z_]*/',
            $method)){
            return $this->getFieldByFields($method, $args);
        }else if(
            preg_match('/get[A-Z]{1}[a-z_]*[A-Z]{1}[a-z_]*[A-Z]{1}[a-z_]*Array/',
            $method)
        ){
            return $this->getPairArray($method);
        }//Add more expressions here.
    }
///////////////////////////////////////////////////////////////////////////////
    protected function getFieldByFields($method, $args){
        // Create a series of value getters
        preg_match('/get([A-Z]{1}.)([A-Z]{1}.)By([A-Z]{1}.*)/', $method,
            $matches);
        $table = strtolower($matches[1]);
        $get = strtolower($matches[2]);
        preg_match_all('/[A-Z]{1}[^A-Z]*/', $matches[3], $split);
        $where = self::createWhereStatement($split, $args, $table);
        $query = "SELECT $get FROM $table $where";
        $result = $this->query($query);
        if($result){
            $r = $result->fetchAll();
            if(count($r)==1){
                return $r[0][0];
            }else{
                return $r;
            }
        }else{
            return null;
        }
    } 
    //Add more methods here.
}

我很好奇是否有人已经做过这件事或非常相似的事情,所以我不必这样做,但我也很好奇,如果我错过了认为这会有所帮助的事情。 (我的一般想法是,因为它扩展了PDO,当我需要更复杂的东西时,我总是可以回到正常的SQL查询。)

1 个答案:

答案 0 :(得分:1)

听起来你正在建立一个ORM的开端。这意味着是时候强制性链接:

http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx