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

时间:2012-02-27 18:36:06

标签: php oop orm pdo

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

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

class DBObject {

    protected
        $record = array();

    function __construct(array $record) {
        if(!empty($record)) {
            $this->loadRecord($record);
        }
    }
}

理想情况下,我想使用从数据库传递的值数组来调用构造函数,而不是使用__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;
}

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

3 个答案:

答案 0 :(得分:3)

您不需要将参数传递给构造函数,以使用PDO :: FETCH_CLASS创建具有私有成员的类。你可以这样做:

<?php
class Songs
{  

    private $artist;
    private $title;

    public function __construct()
    {  
    }

    public function get_artist()
    {
    return $this->artist;
    }

    public function get_title() 
    {
    return $this->title;
    }

    private function set_artist($artist) 
    {
    $this->artist = $artist;
    }

    private function set_title($title) 
    {
    $this->title = $title;
    }
}

我实际上是在我建立的演示网站上这样做的。它适用于PDO :: FETCH_CLASS。默认情况下,FETCH_CLASS通过在构造函数之前填充字段来创建对象。把它想象成绕过构造函数。它将与私人成员一起完成。

如果你宁愿将参数传递给构造函数,你可以像这样查询:

$obj = $statement->fetchALL(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, 'Songs', $params);

在这种情况下,您的构造函数将如下所示:

public function __construct($params)
{
    $this->artist = $params[0]['artist'];
    $this->title= $params[0]['title'];
}

答案 1 :(得分: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;
        }
    }
}

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

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

是的,这仍然不会通过你的构造函数传递它们。

答案 2 :(得分:0)

如何使用magic __set()方法:

<?php
class MyClass
{
    protected $record = array();

    function __set($name, $value) {
        $this->record[$name] = $value;
    }
}

$pdo = new PDO("mysql:host=localhost;dbname=db", 'user', 'password');
$results = $pdo->query('SELECT * FROM table');
$results->setFetchMode(PDO::FETCH_CLASS, 'MyClass');

PHP将为每个传递其名称和值的不存在的属性调用此魔术方法。