我想知道是否可以将 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/