PDO:获取类选项以将字段作为数组发送到构造函数

Wil*_*gan 5 php oop orm pdo

嘿伙计们(和女孩们?)我想知道是否可以优雅地将PDO查询的结果映射到类中的数组成员,而不是让它们作为该对象的公共属性浮动.

说我有(浓缩)以下内容:

class DBObject {

    protected
        $record = array();

    function __construct(array $record) {
        if(!empty($record)) {
            $this->loadRecord($record);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想使用从数据库传递的值数组调用构造函数,而不是使用__set或任何其他奇怪的方法.所以使用PDO现有的API会很棒.

我目前的粗略get_all功能已经达到了这个目的:

static function get_all() {
    $class = get_called_class();
    $results = DB::factory()->query('SELECT * FROM ' . $class . ' ORDER BY ID');
    $results->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, $class);
    return $results;
}
Run Code Online (Sandbox Code Playgroud)

注意:我正在通过PDO运行PHP 5.3和MySQL,并且已经知道使用__set可以解决这个问题,但我明确地希望避免使用它来支持更高性能的东西.

Daa*_*mer 1

删除了之前的代码


对了,你不能做这样的事情吗:

class DBObject {

    protected $record = array();

    function __construct($record = null) {
        if(null === $record){
            $obj_vars = get_object_vars($this);
            $cls_vars = get_class_vars(get_class($this));
            $this->$record = array_diff_key($obj_vars, $cls_vars);
        }else{
            $this->record = $record;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,这样做的问题是这些值仍然可以作为公共成员使用。但它要做的是将“预定义”(类)成员与实际(对象)成员进行比较。

由于 PDO 将在对象中创建新成员,因此您可以使用 array_diff_key 来获取“新”成员。

是的,这仍然不会将它们传递给您的构造函数。