0

这个问题与这里已经提出的问题非常相似:PDO using PDO::FETCH_PROPS_LATE and __construct() call?

但是,该问题中接受的答案并没有真正回答如何将获取的值传递给类的构造函数,如果这可能的话。这是一些简化的代码:

<?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”和“code”被传递给构造函数。但是我想将名称和代码的实际值传递给构造函数(显然)。

这可以做到吗?如果是,如何?我使用bindColumn()吗?

4

1 回答 1

1

基本上,任何 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 它会做相反的事情。

去尝试一下。

于 2013-05-30T01:32:48.450 回答