Singleton'ununu yönetmek için bir yol için en iyi nedir?

4 Cevap php

Ben farklı PHP günlük çerçeveler ile karıştırmasını duyuyorum. Şu anda PEAR çalışıyorum :: Oturum. Ben emin sınıfın yalnızca bir örneği etrafında orada yapmak için onun singleton işlevini kullanmak düşündüm.

Ben muhtemelen test sisteminde basit bir senaryo oldu çünkü günlük eklemek istedim küçük bir cin gibi komut dosyası var. Bu script çeşitli fonksiyonlara sahiptir. Herhalde fonksiyonların içindeki şeyler oturum isteyeceksiniz.

Ben soru nasıl en iyi bu tekiz yönetmek yapmak nedir?

Bana bu çağrı için:

&Log::singleton($handler, $name, $ident, $conf, $maxLevel);

her işlev zaten ilk çağrısında tüm seçenekler özellikle belirtilen bu yana ideal görünmüyor. Armut :: Giriş bu bilgi serializes, ama hala örneği almak için bu değişkenlerin tüm sağlamak zorunda gibi görünüyor ne.

Başka bir alternatif, her işlevi örneği geçiyor. Ideal daha az gibi yine görünüyor.

Ben size örnek bir 'küresel' de yapabilir varsayalım.

Ne bu durumda ne? Daha iyi çözümler var mı?

4 Cevap

Ben PEAR :: Giriş hakkında çok şey biliyorum, ama neden / günlüğünü kolaylaştırır sarar başka tekiz yaratmak değil.

class Logger {

    private static $log;

    private function __construct() { }

    public static function init(Log $log) {
        self::$log = $log;
    }

    public static function get() {
        return self::$log;
    }

}

Eğer Log örneği ile Logger başlatılamadı kez Logger::get üzerinden erişebilirsiniz. KQUEUE PHP mümkün olduğundan, daha sonra yapabilirsiniz

Logger::get()->doSomething($foo, $bar);

Daha da iyisi, nihai hedef sadece körü körüne arama yapabilmek için ise

Logger::Write("Something happened");

Eğer ihtiyacınız olan her yerde, sen bir adım daha Michal çözümünü alabilir

class Logger {
    private static $log = null;

    public static function init(Log $log) {
        self::$log = $log;
    }

    public static function Write(String $str) {
        if($log == null)
            init(Log::singleton(...));

        $this->log->Write($str);
    }
}

Bu şekilde, günlük, bir kez kullanılan ilk kez başlatılır.

Sadece küresel bir örneğini kullanın. Somewhere tüm diğer dosyaları içermelidir bir dosya olmalıdır. Sadece orada örneğini. Eğer küresel değişkenler karşı bir şey varsa muhtemelen PHP programlama edilmemelidir.

Başka bir alternatif, her işlevi örneği geçiyor. Yine, ideal bir daha onun daha az gibi görünüyor.

Temelde bir nesne örneği başına veya küresel kapsamları birinde, fonksiyon başına bağımlılıkları geçen seçim var. Ben nesne örneği kapsamı kullanarak genellikle esneklik iyi bir denge vurur bulabilirsiniz. Genellikle, mümkün olduğunca değişkenlerin kapsamını sınırlamak için çalışmalısınız, bu nedenle mantıklı eğer, tüm yollarla fonksiyon parametreleri geçer.