SORU
4 Ocak 2011, Salı


PHP veritabanı ile tek kullanım-örnek bir erişim var mı?

Ben PDO ile MySQL veritabanına erişmek. Veritabanına erişim kuruyorum, ve benim ilk denemem aşağıdaki gibi kullanabilirsiniz:

Aklıma gelen ilk şey global:

$db = new PDO('mysql:host=127.0.0.1;dbname=toto', 'root', 'pwd');

function some_function() {
    global $db;
    $db->query('...');
}

Bu kötü bir uygulama olarak kabul edilir. Küçük bir araştırmadan sonra, hangi Singleton pattern ile sona erdi

"orada bir sınıfın tek bir örneği olması gereken durumlar için geçerlidir."

El kitabındaki örneğe göre, bunu yapalım:

class Database {
    private static $instance, $db;

    private function __construct(){}

    static function singleton() {
        if(!isset(self::$instance))
            self::$instance = new __CLASS__;

        return self:$instance;
    }

    function get() {
        if(!isset(self::$db))
            self::$db = new PDO('mysql:host=127.0.0.1;dbname=toto', 'user', 'pwd')

        return self::$db;
    }
}

function some_function() {
    $db = Database::singleton();
    $db->get()->query('...');
}

some_function();

Neden bunu yapmak varken, nispeten büyük o derse ihtiyacım var mı?

class Database {
    private static $db;

    private function __construct(){}

    static function get() {
        if(!isset(self::$rand))
            self::$db = new PDO('mysql:host=127.0.0.1;dbname=toto', 'user', 'pwd');

        return self::$db;
    }
}

function some_function() {
    Database::get()->query('...');
}

some_function();

Bu sonuncusu mükemmel çalışıyor ve $db artık endişelenmenize gerek yok.

Nasıl küçük singleton bir sınıf oluşturun, ya da bir-case kullanımı PHP atladığım tekiz için orada olabilir miyim?

CEVAP
4 Ocak 2011, Salı


Tekiz hayır - PHP kullanmak demek değil, çok az var.

Nesneleri paylaşılan bellek içinde yaşadığı dil, Tek hafıza kullanımını düşük tutmak için kullanılır. İki nesne oluşturmak yerine, genel olarak paylaşılan bir uygulama hafızasından varolan örneği başvurusu. PHP bu uygulama belleği yok. Tek bir İstek yarattı tam olarak istemek için yaşıyor. Tek bir İsteği aynı zamanda oluşturulan hala tamamen farklı bir örnek. Böylece, bir Tek iki ana amaçlarından biri burada geçerli değildir.

Ayrıca, kavramsal olarak yalnızca bir kez uygulamanız bulunabilir nesnelerin Birçok dile mekanizması bu uygulamak gerekmez. Eğergereksadece bir örnek için, o zaman don't instantiate another. Sadece zamanolabilirbir Singleton Kullanmak için geçerli bir Durum olabilir bu örneği yavru kedi ikinci bir örneğini oluşturduğunuzda ölünce, örneğin, diğer.

Diğer amaç aynı İstek içinde bir örnek, küresel erişim noktası olacaktır. Bu cazip gelebilir iken, gerçekten küresel kapsamı (herhangi bir bütünsel ve statik gibi) kaplin oluşturduğu için değil,. This makes Unit-Testing harder ve genel olarak uygulama daha az rahat. Bunu önlemek için yollar vardır, ama birçok sınıfta aynı örneği olması gerekiyorsa genel olarak, Dependency Injection kullanın.

Ek bilgi için Singletons in PHP - Why they are bad and how you can eliminate them from your applications benim slayt bakın.

Hatta Erich Gamma, Singleton desen mucitler, günümüzde bu desen şüphe:

"I'm in favor of dropping Singleton. Its use is almost always a design smell"

Daha fazla okuma

Eğer yukarıdaki sonra, hala karar verme konusunda yardıma ihtiyacım var:

Singleton Decision Diagram

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Chaoticmoogle

    Chaoticmoogl

    13 ŞUBAT 2006
  • EEVblog

    EEVblog

    4 NİSAN 2009
  • Ralph Phillips

    Ralph Philli

    5 Aralık 2006