Ben her PHP sınıfının yapıcı küresel bildirmek zorunda kalmadan değişken küresel görünür yapabilir miyim?

5 Cevap php

Bir veritabanı bir örneği ana bildirilmiş sınıf, index.php olarak sahip

$db = new Database();

$db değişken küresel bildirmek zorunda kalmadan tüm diğer sınıfların tanınması için bir yolu var mı

global $db;

Her sınıfın yapıcısı mi?

5 Cevap

Hayır her sınıfın yapıcısı Küresel $ db beyan etmek zorunda.

ya Küresel dizi kullanabilirsiniz: $ _GLOBALS ['vars'];

Bunu aşmanın tek yolu (Here bir açıklama için bakınız) Singleton Method denilen, onu sarmak için bir statik sınıf kullanmaktır. Ama bu çok kötü bir uygulamadır.

  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.
   }

Tekiz yöntemi emin herhangi bir sınıfın tek bir örneği vardı yapmak için oluşturuldu. Insanlar globalling kısayol için bir yol olarak kullanın çünkü Ama, tembel / kötü programlama olarak bilinen olur.

StackOverflow Knowledge
How to Avoid Using PHP Global Objects
Share Variables Between Functions in PHP Without Using Globals
Making a Global Variable Accessible For Every Function inside a Class
Global or Singleton for Database Connection

Ben bunu biraz farklı yapmak. Ben genellikle bir global uygulama nesnesi (App) var. O nesnenin içinde ben vs benim db nesneleri önbelleğe alma nesneleri oluşturma gibi bazı temel başlatma yapın

Ben de böylece (uygulama nesne tanımı gösterilmemiştir) .... App nesnesi döndüren bir küresel işlevi vardır:

define('APPLICATION_ID', 'myApplication');

${APPLICATION_ID} = new App;

function app() {
    return $GLOBALS[APPLICATION_ID];
}

Öyleyse ben küresel nesne içindeki nesneleri başvurmak için herhangi bir kod aşağıdaki gibi bir şey her yerde kullanabilirsiniz:

app()->db->read($statement);
app()->cache->get($cacheKey);
app()->debug->set($message);
app()->user->getInfo();

Mükemmel değil ama birçok durumda işleri kolaylaştırmak için bulabilirsiniz.

Eğer kullanabilirsiniz

$GLOBALS['db']->doStuff();

veya alternatif olarak tekiz erişim yöntemi çeşit kullanarak

Database::getInstance()->doStuff();

Neden yapıcısında global $db; içeren bir sınıf oluşturmak değil, bu tüm diğer sınıfları uzatmak?

Sen Database örneğini saklamak ve almak için bir Registry sınıfını kullanabilirsiniz.

class Registry
{
    protected static $_data = array();

    public static function set($key, $value)
    {
        self::$_data[$key] = $value;
    }

    public static function get($key, $default = null)
    {
        if (array_key_exists($key, self::$_data)) {
            return self::$_data[$key];
        }

        return $default;
    }
}

Registry::set('db', new Database());
$db = Registry::get('db');