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() メソッドもプロパティを割り当てます。

そのため、正しく持っているので、列と同じ名前のプロパティを作成しました。ゲッターもセッターもコンストラクターも必要ありません!

次のようにクラスのコンストラクターに値を渡すことができます。

$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 に答える