嘿伙计们(和女孩们?)我想知道是否可以优雅地将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可以解决这个问题,但我明确地希望避免使用它来支持更高性能的东西。
答案 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将为每个传递其名称和值的不存在的属性调用此魔术方法。