PHP Singleton

4 Cevap php

kullanıcıların kayıt ve kimlik bilgileri ile giriş gerektiren PHP bir web uygulaması üzerinde çalışıyorum. Ancak, ben tüm benim PHP sınıf dosyalarında singleton deseni kullanıyorum.

Ben açıklamak istiyorum aklımı rahatsız bir şey var. Örneğin, uygulama canlı gider ve biz (sahne arkasında) aynı php sınıfları çağırarak burada benzer şeyler yapıyor, aynı zamanda sitede birçok kullanıcımız var zaman. Şimdi, tekiz, bir sınıfın birden çok örneği önler ve sadece tek bir örneğini döndürür beri. Bir ihtimal diğer kullanıcının eylem ile çatışma sitede bir kullanıcının eylemi neden olur.

örneğin ben search.php adında bir sınıf var ve bir tek sınıftır. Bu sınıf, web sitesindeki tüm arama sorguları işler. Birden fazla kullanıcı aynı anda sitede bir arama yapıyorsanız, onların eylemleri oluşturulabilir Ara sınıf onun sadece bir tek örnek bu yana birbirleriyle çakışır.

Zaman ayırdığınız için çok teşekkür ederiz.

4 Cevap

Kısa cevap yok.

Her sayfa isteği benzersiz bir örneği olarak ele alınır ve her kullanıcı için onları bir araya kravat tek şey oturum tanımlama olur. Eğer bir komut çağırdığınızda başlar ve komut bitince ölür bir uygulama olarak PHP düşünmeye çalışın. Bu herhangi bir devleti korumak değil ve herhangi bir diğer PHP örneklerini doğal farkında da değildir.

Singleton deseni sadece size bunu önceden başlatılmış veya edilmemiş olup olmadığını umurumda gerek kalmadan (global) gibi herhangi bir yere kod çağırabilirsiniz bir sınıf tasarımı için bir yoldur ve bunu bellekte devam etmek istiyorum.

Her isteği kendi kendine yeten ve (eğer memcache gibi bunun için belirli uzantıları, kullandığınız sürece) diğer istekleri ile veri paylaşımı değildir. Yani uygulama singletons sahip ayrı kullanıcıların ayrı isteklerini etkilemez olmaz.

Ne sizin için endişe olmalıdır tekiz desen sizin aşırı olduğunu. Bir tekiz küresel bir OO versiyonu, ve eğer dikkatli olmazsanız, bazı garip hatalar neden olabilir. Küresel ayarları güveniyor ve idareli singletons kullanmayın scoped işlemlerini kullanmak daha iyidir.

Singleton deseni daha tartışmalı desen biridir. Eleştirmenler Singletons bir uygulamaya Küresel Devlet tanıtmak ve sıkıca çift Singleton ve alıcı sınıfları savunuyorlar. Bu da test etmek ve korumak için daha fazla bir kod yol açar gizli bağımlılıklar ve beklenmedik yan etkilere yol açar.

Eleştirmenler ayrıca, nesneleri yalnızca zaten Request içinde benzersiz nerede PHP gibi bir Paylaşılan şey Mimarlık bir Singleton kullanmak anlamsız olduğunu savunuyorlar. Bu kolay ve bir kez Talebin başında Üreticileri ve Fabrika kalıplarını kullanarak işbirlikçi nesne grafikler oluşturmak için temizleyicidir.

Singletons da "SOLID" OOP tasarım ilkeleri ve Demeter Kanunun bazı ihlal. Singletons getirilemez. Onlar (PHP 5.3 öncesi) alt tipi olamaz çünkü Singleton statik bir özellik olarak depolanan örneğinin Toplanan Çöp olmayacaktır.

Ben cevap hayır, katılıyorum. Ben şu anda PHP Singleton deseni hakkında düşünüyordum ve Singleton deseni PHP kodlu olmasına rağmen örnek istekleri arasında paylaşılan (veya durumda süreç bellekte saklanan olmadığı, gerçekten uygulamaya olmadığını karar verdik Raylar üzerinde ASP.net, Java ve Ruby?) gibi web sunucu ortamları için Sen Singleton örneği serileştirebilirsiniz ve oturumda saklayabilir, ama yine de, bu oturumlar arasında paylaşılır değil. Ben tam PHP Singleton deseni uygulamak için önbellekte saklanır olurdu spekülasyon. Ama henüz yapmadıysanız, bu yüzden emin değilim.