2009-07-18 18 views
6

Şu anda, gelecekte tam bir CMS'ye dönüşmeyi umduğum bir blog sistemi oluşturuyorum.PHP genel nesnelerini kullanmaktan nasıl kaçınılır?

Genel erişim için yararlı olacak iki sınıf/nesne vardır (mysqli veritabanı bağlantısı ve bir kullanıcının giriş yapıp yapmadığını kontrol eden bir özel sınıf).

Bunu genel nesneler kullanmadan ve mümkünse nesneleri her çağrıldığında her bir işleve aktarmamak için bir yöntem arıyorum.

cevap

13

Nesneleri Statik yapabilir, daha sonra bunlara her yerden erişebilirsiniz. Örnek:

myClass::myFunction(); 

Bu, komut dosyasında herhangi bir yerde çalışır. Ancak, statik sınıfları okumak isteyebilirsiniz ve muhtemelen herhangi bir yerde kullanılabilecek bir statik nesnenin içinde normal bir sınıf oluşturmak için bir Singleton sınıfı kullanmak isteyebilirsiniz.

Expanded

Ben ne yapmaya çalışıyorsun benim DB sınıfla ne çok benzer olduğunu düşünüyorum. Eğer $ nesne = myClass :: get_connection() kullanarak bağlantı aldıktan sonra ne olur

class myClass 
{ 
    static $class = false; 
    static function get_connection() 
    { 
     if(self::$class == false) 
     { 
      self::$class = new myClass; 
     } 
     return self::$class; 
    } 
    // Then create regular class functions. 
} 

olduğunu düzenli şey işlevini yapmak mümkün olacak. Statik beyanlar, sadece get_connection arayıp bir değişkene dönüş değeri atamak zorunda yaptıktan sonra

$object = myClass::get_connection(); 
$object->runClass(); 

Expanded. Ardından, işlevlerin geri kalanı $ class = new myClass ile adlandırdığınız bir sınıfla aynı davranışa sahip olabilir (çünkü yaptığımız şey budur). Yaptığınız tek şey, sınıf değişkenini statik bir sınıf içinde saklamak. Zaten blog sistemine bakın hangi bazı nesne varsa onlar $blog->db() ve $blog->auth() ya da her neyse yapmayacak şekilde

class myClass 
{ 
    static $class = false; 
    static function get_connection() 
    { 
     if(self::$class == false) 
     { 
      self::$class = new myClass; 
     } 
     return self::$class; 
    } 
    // Then create regular class functions. 
    public function is_logged_in() 
    { 
     // This will work 
     $this->test = "Hi"; 
     echo $this->test; 
    } 
} 

$object = myClass::get_connection(); 
$object->is_logged_in(); 
+0

Merhaba, cevabınız için teşekkürler, değişkenleri statik sınıflara kaydetmek mümkündür. Örneğin, kullanıcının giriş yapıp yapmadığını kontrol etmek için işlev çağırın ve sonra bu değişkeni sayfaya birkaç kez daha sonra erişebilirsiniz. –

+2

Evet, statik bir sınıf için, $ class değişkenini bildirmek için yaptığım şeyi aynen yapın. Tek şey, kullandığınız her değişkeni bildirmenizdir. –

+1

Ancak, size verdiğim kod düzenli olarak düzenli bir sınıf kullanmanıza izin veriyor. Statik kısım, sadece onu globalleştirmek yerine size sınıf sağlar. Biraz daha göstermek için düzenleyeceğim. –

1

Eh, pek istekli bu nesneleri oluşturabilirsiniz.

+0

Yapabilirim, ancak nesnelerin blog sınıfının dışında da erişmesi gerekecek. –

8

Halihazırdaki genel nesneleri yapıcıya aktarabilirsiniz.

<?php 
    class Foo { 
    protected $m_db; 
    function __construct($a_db) { 
     $this->m_db = $a_db; 
    } 
    } 
?> 
3

Kısa süre önce şirketimin CMS'sinin ikinci sürümüne hazırlanırken çerçevemi yeniledim. Ben bunları normal nesnelerle değiştirmek için statik yaptığım şeylerin büyük bir kısmını undid. Bunu yaparken, bana giden ve çekirdek dosyalara korsanlık etmemde kullanılan büyük bir esneklik yarattım. Şimdi sadece tek seçenek, sadece düşük seviyeli çekirdek işlevselliği ile ilgili olan global fonksiyon olduğunda statik yapıları kullanıyorum.

Bootstrap.php dosyasımın birkaç satırını göstereceğim (tüm isteklerim bu dosyadan gönderilir, ancak her bir dosyanın üstüne ekleyerek aynı sonucu elde edebilirsiniz) size göstermek için demek istedigim. Bu, muhtemelen sizin durumunuzda kullanacağınız şeylerin oldukça ağır bir versiyonudur, ama umarım bu fikir faydalıdır. (Bu biraz değiştirildi.) Gördüğünüz gibi, ben onları bu "küresel" ihtiyaçlar için erişim vermek diğer nesnelere yapıcı bir argüman olarak verilen edebilirsiniz başvurum nesnesini oluşturmak için seçenekler her türlü var

//bootstrap.php 

... 

// CONSTRUCT APPLICATION 

{  
    $Database = new Databases\Mysql(
     Constant::get('DATABASE_HOST'), 
     Constant::get('DATABASE_USER'), 
     Constant::get('DATABASE_PASSWORD'), 
     Constant::get('DATABASE_SCHEMA') 
    ); 

    $Registry  = new Collections\Registry; 
    $Loader  = new Loaders\Base; 
    $Debugger  = new Debuggers\Dummy; // Debuggers\Console to log debugging info to JavaScript console 

    $Application = new Applications\Base($Database, $Registry, $Loader, $Debugger); 
} 

... 

.

Veritabanı nesnesi kendiliğinden açıklayıcıdır. Kayıt nesnesi, uygulamada başka bir yere erişmek isteyebileceğim nesne için bir kapsayıcı görevi görür. Yükleyici, şablon dosyaları gibi diğer kaynakları yüklemek için bir yardımcı program görevi görür. Ve hata ayıklayıcı, hata ayıklama çıktısını işlemek için var.

Örneğin, başlattığım veritabanı sınıfını değiştirebilirim ve bir SQLite veritabanıyla bağlantım var. Hata ayıklayıcının sınıfını değiştirebilirim (belirtildiği gibi) ve şimdi tüm hata ayıklama bilgilerim JavaScript konsoluma kaydedilecek.

Şimdi soruna dönelim. Tüm bunlara erişim için başka nesneler nasıl veriyorsunuz? Bunu sadece yapıcıya bir argümanla iletirsiniz.

// still bootstrap.php 

... 

// DISPATCH APPLICATION 

{ 
    $Router = new Routers\Http($Application); 
    $Router->routeUri($_SERVER['REQUEST_URI']); 
} 

... 

Sadece bu değil, aynı zamanda Yönlendiricim (veya onunla oluşturduğum herhangi bir nesne) de daha esnektir. Şimdi uygulama nesnesini farklı bir şekilde örneklendirebilirim ve Yönlendiricim buna göre farklı davranacaktır.

İlgili konular