PHP Singleton: örneği tutmuyor

4 Cevap php

Ben sadece vb.net çalışan yaştan sonra php içine dalış oluyorum.

Benim webapp üzerinde singleon, burada kodu olarak çalışan bir logger sınıf yazmak istiyorum:

class cLog{

private $data = NULL;


static private $instance = NULL;

static public function getInstance(){
    if(self::$instance == NULL){
        echo "empty!";
        self::$instance = new cLog();           
    }   
    return self::$instance;
}


private function __construct(){     
}   
private function __clone(){     
}



public function getData(){
    return self::getInstance()->data;
}

public function trace($o){
    self::getInstance()->data[] = $o;
}

}

Ne bekliyoruz benim uygulama sayfaları arasında geçiş olarak o takunya :: trace () yöntemi çeşitli aramalar, veri dizi artar yapmak ve tüm izleri ile dolu olmasıdır. Ama ne olsun: everytime i nesne yeniden başlatıldığında (: o her şey gösterir Gördüğünüz gibi, ben örnek gaz giderici hat! "Boş" bir yankı koymak) yani $ örnek null, bir sayfa çalıştırmak

Ben php uygulama yaşam döngüsü içinde yanlış anlama bir şey var sanırım ....

İşte bir kullanım örneği var:

cLog::getInstance()->trace("hello world");
$logs = cLog::getInstance()->getData();

Teşekkürler

4 Cevap

PHP bir "pay nothing" mimarisi kullanır. Bu hiçbir sayfa yükleri arasında paylaşılır (diğer şeyler arasında) anlamına gelir. Uygulama ilk sayfa hit başladı ve geldikleri gibi sadece istekleri hizmet, durana kadar çalışır. NET, aksine. PHP, bir sayfa uygulamayı talep her zaman esas derlenir ve sıfırdan çalıştırın.

PHP yaşam döngüsü için "sayfa sona erdi load" "yüklemek için sayfa başından" kadardır.

Genel anlamda, yeni bir sayfa yüklemek, her zaman, her şey sıfırdan başlar.

Bazı yapmak ... ilginç mümkün olabilir ... oturum verileri ile şeyleri siz istediğiniz şekilde çalışması için logger almak için.

İyi şanslar!

But what I get is: everytime i run a page, the $instance is null so the object restarts ... I guess there's something I'm misunderstanding in the php application-lifecycle....

PHP'nin uygulama yaşam döngüsü HTTP bu aynalar. Bir sayfa / URI için her istek vatansız olduğunu. Her istek diğer talepleri hakkında hiçbir şey bilmiyor. Bu, tasarım gereğidir. Eğer açıklanan davranış gerektiği gibi PHP oyunculuk.

Her isteği diğer isteklerin ne olduğunu bilmek için ekstra adımlar atması gerekiyor. (PHP'nin oturum yönetimi bunu yapmak için tek yoldur)

Bunun yerine PHP uygulama yaşam döngüsü sorunuzu ele, ben hazır bir günlük sınıfını kullanarak bir öneri yapmak istiyorum.

Zend Framework Fabrika deseni kullanır ve benzeri veritabanları, dosya sistemi, e-posta, ve oturum Writer nesneler geniş bir çeşitlilik vardır Zend_Log vardır.

http://framework.zend.com/manual/en/zend.log.writers.html

Sen kütüphane diğer herhangi bir bölümünü gerek kalmadan Zend_Log kullanabilirsiniz, böylece mevcut sisteme adapte kolay olmalıdır.