2012-01-17 7 views
9

プロパティを格納するために魔法のメソッドを使用するクラスがあります。ここでは簡単な例です:マジックメソッドでPDO :: FETCH_CLASSを使用する

class Foo { 
    protected $props; 

    public function __construct(array $props = array()) { 
     $this->props = $props; 
    } 

    public function __get($prop) { 
     return $this->props[$prop]; 
    } 

    public function __set($prop, $val) { 
     $this->props[$prop] = $val; 
    } 
} 

私は(動作しない)このように、それが実行されます後PDOStatementの各データベースの行のために、このクラスのオブジェクトをインスタンス化しようとしている:

$st->setFetchMode(PDO::FETCH_CLASS, 'Foo'); 

foreach ($st as $row) { 
    var_dump($row); 
} 

問題は、PDO::FETCH_CLASSがプロパティ値を設定しているときに私のクラスのmagic __set()メソッドをトリガしていないようです。

PDOを使用して希望の効果を達成するにはどうすればよいですか?

+1

[PHP PDO:オブジェクトとしてデータを取得する - BEFORE __constructが割り当てられたプロパティが呼び出されます。これは正しいですか?](http://stackoverflow.com/questions/2862279/php-pdo-fetching-data-as-objects-properties-assigned-before-construct-is-ca) – outis

答えて

12

PDOのデフォルトの動作は、コンストラクタを呼び出す前にプロパティを設定することです。フェッチモードを設定してコンストラクタを呼び出した後にプロパティを設定すると、の魔法のメソッドが未定義のプロパティで呼び出されるため、PDO::FETCH_PROPS_LATEをビットマスクに含めます。

$st->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'Foo'); 

あるいは、インスタンスを作成し、その中にフェッチ(すなわちPDO::FETCH_INTOにフェッチモードを設定します)。

+1

ありがとう、これは動作します。好奇心のために、コンストラクタを呼び出す前にそれらを設定するとパフォーマンスが向上しますか?なぜ 'PDO :: FETCH_PROPS_LATE'がデフォルトの動作にならないのか分かりません... – FtDRbwLXw6

+0

@drrcknlsn:なぜ?そこにあるように、他の質問を参照してください。注釈は、明確化の要求を超える追加の質問のためのものではないことに注意してください。 – outis

+1

貼り付けたリンクを読みましたが、これがデフォルトの動作である理由については何の答えもありません。私はコメントにこれを頼んでいます。なぜなら、それはIMOという新しい質問を開くことを保証するのに十分な意味がないからです。でも、私はまだ知りたいと思っています。 – FtDRbwLXw6

関連する問題