OOPHP uygun alternatif desen Singleton için?

2 Cevap php

Şu anda bir oophp uygulama üzerinde çalışıyorum. Ben app için tüm yapılandırma ayarlarını içerecek bir site sınıf var. Başlangıçta, ben ancak esas olarak bu desende katılan test konularda, her nesne sitesi nesne tek bir örneğini başvuru için izin singleton deseni kullanmak için gidiyordu, ben farklı bir yaklaşım denemeye karar verdim.

Benim app sitesi sınıf ana ana sınıfı yapmak ve gerektiğinde mevcut tüm özelliklerini yapmak için, çocuk sınıfları kurucular içinde yapıcı bulunuyor aramak istiyorum.

Ilk kez çalıştırdığınızda, sınıf sadece uygulaması için db ayrıntıları içerecektir. Kalan değerleri almak için bir sorgu db bilgilerini kullanarak yapılmalıdır. Ancak, herhangi bir sonraki örnekleri (tüm değerleri ile) orijinal klon olacaktır. Ben de tamamen yeni bir örneği gereklidir tekrar sorgu gerçekleştirmek için bir Boole bayrağı ayarlayabilirsiniz.

Bu tekil bir alternatif olacak ve bunun neden test sorunları çözmek istiyorsunuz? Bu, tüm teori atm, ben henüz bir şey kod başladı değil bir

Any thoughts or advice greatly appreciated. Thanks.

2 Cevap

Ben daha iyi bir şekilde tüm diğer sınıfların Kurucular geçirilen alacak bir 'yapılandırma' nesne var olduğunu düşünüyorum. Yani, açıkça sadece ihtiyacınız sınıflar için oluşturulan ve iletilen dışında bir singleton gibi hemen hemen bir şey. Bu yaklaşım genellikle denir dependency injection.

Birçok farklı teknikler denedikten sonra, ne işlevsel ve güvenilir bulduk bu yöntem:

Bir ön yükleme veya başlatma dosyasını kullanın. Bu doğrudan erişime karşı uygun izni ve güvenli korumaları ile sitenin KÖK yer almaktadır.

Sitedeki tüm sayfaları ilk önce bu dosyayı içerir. Bunun içinde, ben bütün genel nesneler (ayarlarını, kullanıcı) oluşturmak ve orada onları referans.

Örneğin:

// OBJECT CREATION
$Config = new Configuration();
$User = new User();

Daha sonra bu nesneler talep sınıflar içinde:

public function __construct($id = NULL) {
    global $Config; // DEPENDENCY INJECTION SOUNDS LIKE AN ADDICTION!

    if($Config->allow_something) {
        $this->can_do_something = true;
    }

    if(NULL !== $id) {
        $this->load_record($id);
    }
}

Ben sadece sınıf içinde bu küresel nesnelere erişmek ve nasıl ben ilk yapıcı parametre her zaman olduğu gibi nesne değişkenlerini dahil etmek zorunda değilsiniz dikkat edin. O eski alır.

Ayrıca, statik bir veritabanı sınıfına sahip, çok yararlı olmuştur. Ben geçen hakkında endişelenmenize gerek hiçbir nesne vardır, ben sadece çağrı $row = DB::select_row($sql_statement); olabilir; PhpConsole sınıfını kontrol.