PHP PDO: nesneler olarak getiriliyor veri - atanan özellikleri ÖNCE __ construct denir.

3 Cevap php

Tam soru olmalıdır "Is this correct or is it some bug I can't count on?"

NEDEN bu doğru bir davranıştır?

Ben nesneleri doğrudan veri alma ile PDO ile daha fazla ve özellikle oynamaya çalışıyoruz. Bunu yaparken bu keşfetti:

Ben doğrudan böyle bir nesnenin içine veri almak durumunda:

$STH = $DBH->prepare('SELECT first_name, address from people WHERE 1');
$obj = $STH->fetchAll(PDO::FETCH_CLASS, 'person');

ve böyle bir nesne var:

class person {
  public $first_name;
  public $address;

  function __construct() {
    $this->first_name = $this->first_name . " is the name";
  }
}

Adları tüm "adıdır" eklenir çünkü - bu özellikler __ construct çağrıldığını önce tahsis edilmektedir bana gösteriyor.

Bu (I / üzerinde saymak edemez durumda) bazı hata ya da bu Olmalı Yolu. Gerçekten şu anda çalışır yolu oldukça güzel bir şey çünkü.

Update

Görünüşe göre, according to one of the maintainers Bu bir hata değildir. Cevap 'dokümanlar okumak, onun değil bir hata' olduğu için birisi, 2008 yılında bir hata olarak yayınlanmıştır.

Ancak, gerçekten bu doğru bir davranış olduğunu NEDEN bilmek isterim.

3 Cevap

Kasten bu şekilde çalışır, ve bunu başka türlü faaliyet yapma seçeneği var: çok okuma sonra ben nihayet cevap geldi düşünüyorum.

Eğer onun inşa edilmiş sonra özelliklerini nesnesine getirilecek neden kullanabileceğiniz PDO::FETCH_PROPS_LATE adında bir çoğunlukla belgesiz PDO sürekli var. Örneğin:

$obj = $STH->fetchAll(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'person');

Nesnesi oluşturulur SONRA özellikleri atanacak, bu nedenle yukarıda benim örnek tüm özelliklerini değiştirmek olmaz neden olacaktır. PDO::FETCH_PROPS_LATE devre dışı bırakarak, tabii ki, orijinal söz konusu zaman örnekte anlatıldığı gibi hareket neden olur.

Bakıcılarına aktif hem de davranışları arzu olabileceğini kabul edilir ve size birini yapmak için seçenek verilmiş gibi görünüyor. Dokümantasyon bile açıklamıyor - Ben reading through a list of PDO constants ve onu gördüm, ve bir vuruş verdi.

Yerine PDO PDO :: FETCH_INTO :: FETCH_CLASS kullanmayı deneyin. From the docs:

PDO :: FETCH_INTO: sınıfında adlandırılmış özelliklerine ayarlanır sonucu sütunları haritalama, istenen sınıfın varolan örneği günceller

Yani, daha sonra istenen almak yöntemine örneği geçmek, ilk örneğini oluşturmak istiyorum.

Yani evet bu __ construct çağırmadan önce FETCH_CLASS doldurmak için yerine karşı-sezgisel, söyleniyor. Posta listesinde verilen cevap standart kopyalama ve yapıştırma "KKO" cevaptır. FETCH_INTO çalışırsa, önerilen donanımın (ler) ile bir dokümantasyon hata açılmalıdır.

Eğer bir nesne seri zaman nedeni ya, bir veritabanı veya bir dize, size (normalde) o unserializing zaman özelliklerini yeniden başlatmak istemiyorum.