2012-01-17 19 views
9

Tengo una clase que usa métodos mágicos para almacenar propiedades. Aquí está un ejemplo simplificado:Uso de PDO :: FETCH_CLASS con Magic Methods

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; 
    } 
} 

Estoy intentando crear instancias de objetos de esta clase para cada fila de la base de datos de un PDOStatement después de que ha ejecutado, como esto (no funciona):

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

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

El problema es que PDO::FETCH_CLASS no parece desencadenar el método mágico __set() en mi clase cuando se configura valores de propiedad.

¿Cómo puedo lograr el efecto deseado utilizando PDO?

+1

posible duplicado de [PHP PDO: recuperación de datos como objetos - propiedades asignadas ANTES de que se llame a __construct. ¿Es esto correcto?] (Http://stackoverflow.com/questions/2862279/php-pdo-fetching-data-as-objects-properties-assigned-before-construct-is-ca) – outis

Respuesta

12

El comportamiento predeterminado de PDO es establecer las propiedades antes de invocar el constructor. Incluya PDO::FETCH_PROPS_LATE en la máscara de bits cuando configure el modo de búsqueda para establecer las propiedades después de invocar el constructor, lo que hará que se invoque el método mágico __set en las propiedades no definidas.

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

otra parte, crear una instancia y traiga en ella (es decir, establecer el modo se ha podido recuperar a PDO::FETCH_INTO).

+1

Gracias, esto funciona. Por curiosidad, ¿hay algún beneficio de rendimiento al configurarlos antes de invocar al constructor? No entiendo por qué 'PDO :: FETCH_PROPS_LATE' no sería el comportamiento predeterminado ... – FtDRbwLXw6

+0

@drrcknlsn: por mucho de" ¿por qué? " como hay, mira la otra pregunta. Tenga en cuenta que los comentarios no están destinados a preguntas adicionales más allá de las solicitudes de aclaración. – outis

+1

Leí el enlace que pegó, pero no hay respuesta sobre por qué este es el comportamiento predeterminado. Pregunto esto en los comentarios porque no es lo suficientemente significativo como para justificar la apertura de una nueva pregunta, OMI, pero aún quiero saber. – FtDRbwLXw6