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

标签 php oop orm pdo

我想知道是否可以将 PDO 查询的结果优雅地映射到类中的数组成员,而不是让它们作为该对象的公共(public)属性四处 float 。

假设我有(浓缩的)以下内容:

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 解决,但我明确希望避免使用它以支持更高性能的东西。

最佳答案

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

<?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 通过在构造函数之前填充字段来创建对象。将其视为绕过构造函数。它将对私有(private)成员执行此操作。

如果您更愿意将参数传递给构造函数,您可以像这样进行查询:

$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'];
}

关于php - PDO:获取类选项以将字段作为数组发送到构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9470317/

相关文章:

php - 阵列似乎在 7 项后停止

php - 如何使用ajax加载<a href ="">标签的值

php - AWS php5.4无法连接RDS

orm - 具有干净持久层的域类/实体(DAO、工厂……)

php - Jquery Ajax 加载仅适用于单个单词变量

javascript - ES6如何在类中创建私有(private)变量和方法?

java - 内部类的目的是什么

c++ - 动态创建类

c# - 为什么要抽象一个 ORM?

java - 如何使用 Hibernate 获取两个字段的唯一键?