这个问题与这里已经问过的问题非常相似:PDO使用PDO::FETCH_PROPS_LATE和__construct()调用?
然而,这个问题的公认答案并没有真正回答如何将获取的值传递给类的构造函数(如果可能的话)。下面是一些简化后的代码:<?php
class Course {
private $name;
private $code;
private $prerequisites;
public function __construct($name, $code) {
if(!is_string($code) || mb_strlen($code) !== 7) {
throw new 'InvalidArgumentException('Invalid code.');
}
$this->name = $name;
$this->code = $code;
$this->prerequisites = array();
}
public static function getAllCourses() {
$sql = 'SELECT `name`, `code` FROM `courses` ORDER BY `code`;';
$db = new 'PDO(' ... ', DB_USER, DB_PASS);
$stmt = $db->query($sql);
$stmt->setFetchMode('PDO::FETCH_CLASS | 'PDO::FETCH_PROPS_LATE, 'Course', array('name', 'code'));
return $stmt->fetchAll();
}
}
?>
这段代码的问题是字符串"name"answers"code"被传递给构造函数。然而,我想将名称和代码的实际值传递给构造函数(显然)。
这能做到吗?如果是,怎么做?我使用bindColumn()吗?
基本上,任何PDO::fetch_something()方法都会分配属性。
所以你只需要属性,和列有相同的名字,就像你正确的那样。你甚至不需要getter、setter或构造函数!
可以像这样传递值给类的构造函数:
$stmt->setFetchMode('PDO::FETCH_CLASS,
'Course',
array(<value of col1>, <value of col2>));
注意,在数组中传递的不是列的名称,而是值!
但这很棘手!确保正确设置fetchMode !
如果设置了'PDO::FETCH_PROPS_LATE,它将首先调用__construct,然后设置属性。因此,通过数组传递给__construct的值将被覆盖。
如果你没有设置'PDO::FETCH_PROPS_LATE,它会做相反的。