Singleton ile etkileşim için en etkili yolu nedir?

3 Cevap php

Ben yeni şeyler öğrenmek gibi sürekli kod üzerinde geri gidiyor, kendi yararına bir süre için benim kendi küçük çerçeve üzerinde çalışıyorum. Tahmin edebileceğiniz gibi, ben hemen hemen her nesne tarafından kullanılan bir kayıt nesnesi var.

Şu anda, en temel nesnesi (AFObject) biraz bu gibi ayarlanır

absract class AFObject {

    var $_registry;

    function __construct(){
        $this->_registry = AFRegistry::getInstance();
    }

}

Yani her nesne, artık Sicil yerel bir başvuru içerir. Ben 1 kez örneği yüzlerce nesne var ise, o Singleton başvurular yüzlerce var. Ama her zaman böyle doğrudan Sicil başvurmak için daha fazla veya daha az verimli olacaktır ...

class AFRouter extends AFObject {

    function someMethod( $bar ){
        AFRegistry::$foo = $bar;
    }

}

3 Cevap

Sınıfların Benim düşünceme göre, "sicil" türü tür smells.

Eğer öğrenme ve daha iyi almak için bu yaptıklarını belirtilen beri, hiç tamamen kayıt sınıfını ortadan kaldırılması ve başka bir yaklaşım alarak kabul var? Belki yerine sınıfın iç çekerek sınıf yapıcıları için gerekli veri bastırıyor?

Sonra sınıfları tüm diğer bazı sınıflara bağımlı hale gelir, çünkü seçenek 1 (soyut temel sınıf) dışarı çıkmak istiyorum ...

Eğer bir kayıt defteri ayarı korumak istiyor musunuz eğer Yngve Sneen belirtildiği gibi statik bir sınıfını kullanarak benim görüşüme göre en iyi yaklaşım olacaktır.

Something like: registry::set('var1', $var1); $var1 = registry::get('var1');

Bu düşünün:

class AFRouter extends AFObject {
  function someMethod($bar) {
    global $af_registry;
    $af_registry->setFoo($bar);
  }
}

hatta:

class AFRouter extends AFObject {
  function someMethod($bar) {
    af_registry_set('foo', $bar);
  }
}

Sözdizimi Bar, bu ve geçerli çözüm arasında esasen hiçbir fark yoktur.

Evet, bu kayıt defteri aslında global bir değişken olduğu anlamına gelir. Ve evet, küresel değişkenler ile ilgili sorunlar vardır. Daha iyi bir seçenek pass in the dependencies olacaktır.

Ben (100 referanslar gerçekten bir sorun değil çünkü, ve biraz erken optimizasyon) Bu durumda verimlilik düşünmek gerektiğini sanmıyorum. Ama kod en zarif olanı düşünün. Eğer (bu statik bir sınıf olarak uygulanabilir?) A tek ihtiyacınız varsa, düşünün. Sizin kod yapar beri belki biraz daha belirgin (en azından ben öyle düşünüyorum), ikinci davayı kullanmayı tercih ediyorum.

Bu durumda olurdu

class AFRouter extends AFObject {

    function someMethod( $bar ){
        AFRegistry::getInstance()->$foo = $bar;
    }

}

Yoksa mülkiyet saklanması ise:

class AFRouter extends AFObject {

    function someMethod( $bar ){
        AFRegistry::getInstance()->setFoo($bar);
    }

}