PHP küresel nesneleri kullanarak nasıl önlenir?

4 Cevap php

Ben şu anda gelecekte tam bir CMS dönüşmesi için umut blog sistemi, oluşturma.

İki sınıfları / (mysqli veritabanı bağlantısı ve bir kullanıcı oturum olup olmadığını denetler özel bir sınıf) küresel erişim için yararlı olacağını nesneler vardır.

Ben genel nesneler kullanmadan bunu yapmak için bir yol arıyor, ve mümkünse, her fonksiyon için onlar denir her zaman nesneleri geçirerek değilim.

4 Cevap

Sen o zaman her yerde onlara erişimi, nesneler Statik yapabilir. Örnek:

myClass::myFunction();

Bu komut her yerde çalışacaktır. Sen ancak statik sınıflar kadar okumak istiyorum, ve muhtemelen her yerde kullanılabilir statik bir nesne içinde düzenli bir sınıf oluşturmak için bir Singleton sınıf kullanarak olabilir.

Expanded

Ben ne yapmaya çalışıyorsun benim DB sınıfla ne çok benzer olduğunu düşünüyorum.

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

Eğer $ nesnesini kullanarak, bağlantı aldıktan sonra Ne olur = myClass :: get_connection (), düzenli olarak bir şey işlevi yapmak mümkün olacak.

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

Expanded

Eğer statik bildirimleri yapmak sonra, sadece get_connection aramak ve bir değişkene dönüş değerini atamanız gerekiyor. (Biz ne yaptığını çünkü) Sonra fonksiyonların geri kalanı $ class = new myClass ile çağrılan bir sınıf olarak aynı davranışı olabilir. Tüm yapıyorsun statik bir sınıf içinde sınıf değişkeni depoluyor.

class myClass
{
    static $class = false;
    static function get_connection()
    {
    	if(self::$class == false)
    	{
    		self::$class = new myClass;
    	}
    	else
    	{
    		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();

Siz yapıcı şu anda küresel nesneler geçebileceği.

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

Geçenlerde şirketimizin CMS ikinci versiyonu için hazırlık benim çerçeve yenilemiştir. Normal nesnelerle onları değiştirmek için ben statik yapılan şeylerin I undid büyük bir miktardır. Bunu yaparken, bana geçiyor ve çekirdek dosyaların içine hack güvenmek için kullanılan bir esneklik büyük miktarda yarattı. Tek alternatif sadece düşük seviyeli çekirdek işlevselliği ile ilgili küresel işlevler olduğunda ben şimdi sadece statik yapıları kullanın.

Benim bootstrap.php dosyasının birkaç satır göstermek için gidiyorum (benim isteklerin tümünü bu dosyanın yoluyla gönderilen olsun, ama her dosyanın en başında dahil ederek aynı sonucu elde edebilirsiniz) ne demek istediğimi göstermek için. Bu muhtemelen durumda kullanmak istiyorum ne bir oldukça ağır versiyonu, ama umarım fikir yararlıdır. (Bu, tüm hafifçe modifiye edilmiştir.)

 //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);
}

...

Gördüğünüz gibi, ben bu "küresel" ihtiyaçlar için onlara erişimi vermek için diğer nesnelere yapıcı bir argüman olarak sağlanan olabilir benim uygulama nesnesi oluşturmak için seçenekler her türlü var.

Veritabanı nesne kendi kendini açıklayıcı. Kayıt nesne başka bir yerde uygulamada ulaşmak isteyebilirsiniz nesne için bir kap gibi davranır. Yükleyici şablon dosyaları gibi diğer kaynaklara yükleme için bir yardımcı olarak görür. Ve ayıklayıcı çıkış işlemek için vardır.

Örneğin ben, ben örneğini veritabanı sınıfı değiştirebilir ve, işte ben bir SQLite veritabanı için bir bağlantı var. (Belirtildiği gibi) debugger'ın sınıfını değiştirebilir ve şimdi benim hata ayıklama tüm bilgi benim JavaScript konsoluna kaydedilir.

Tamam, şimdi konuya geri. Nasıl diğer nesneleri tüm bu erişim veriyorsunuz? Sadece yapıcı bir argüman geçmek.

// still bootstrap.php

...

// DISPATCH APPLICATION

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

...

Sadece benim Router (veya ne olursa olsun nesne onunla inşa), çok daha esnek olduğunu, ancak. Şimdi ben sadece farklı benim uygulama nesne örneğini, ve benim Router farklı buna göre davranacaktır.

Zaten blog sistemine bakın hangi bazı nesne varsa onlar $blog->db() ve $blog->auth() veya ne olursa olduğunuzu çok iyi, sen, o, bu nesneleri oluşturabilirsiniz.