2012-01-17 12 views
9

Özellikleri depolamak için sihir yöntemlerini kullanan bir sınıfa sahibim. Bu (çalışmıyor) gibi, yürütüldüğünde sonra ben PDOStatement her veritabanı satırı için bu sınıfın nesneleri örneğini çalışıyorumPDO :: FETCH_CLASS'ü Sihirli Yöntemlerle Kullanma

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

: Burada basitleştirilmiş bir örnektir

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

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

Sorun, PDO::FETCH_CLASS'un özellik değerlerini ayarlarken sınıfımdaki sihirli __set() yöntemini tetiklemiyor olmasıdır.

PDO kullanarak istenen efekti nasıl yapabilirim?

+1

olası bir kopyası [PHP PDO: Nesneleri nesne olarak getirme - öznitelikler atanan ÖNCE __construct denir. Bu doğru mu?] (Http://stackoverflow.com/questions/2862279/php-pdo-fetching-data-as-objects-properties-assigned-before-construct-is-ca) – outis

cevap

12

PDO'nun varsayılan davranışı, yapıcıyı çağırmadan önce özellikleri ayarlamaktır. Oluşturulmayı başlattıktan sonra özellikleri ayarlamak için getirme modunu ayarladığınızda, PDO::FETCH_PROPS_LATE bit maskesi içerisine dahil edilmez; bu, tanımlanmamış özelliklerde __set sihirli yönteminin çağrılmasına neden olur.

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

Seçenek olarak ise, bir örneğini oluşturmak ve içine almak (yani PDO::FETCH_INTO modunu getirme ayarlanır).

+1

Teşekkür ederim, bu işe yarıyor. Merak etme, kurucuyu çağırmadan önce onları kurmak için bir performans avantajı var mı? Neden "PDO :: FETCH_PROPS_LATE" varsayılan davranışı olmayacağını anlamıyorum ... – FtDRbwLXw6

+0

@drrcknlsn: "Neden?" olduğu gibi, diğer soruya bakın. Açıklamaların, açıklama taleplerinin ötesinde ek sorular getirmediğini unutmayın. – outis

+1

Yapıştırdığınız bağlantıyı okudum, ancak bunun neden varsayılan davranış olduğuna dair bir yanıt yok. Bunu yorumlarda soruyorum çünkü yeni bir soru olan IMO'nun açılmasını gerektirecek kadar önemli değil ama yine de bilmek istiyorum. – FtDRbwLXw6

İlgili konular