簡體   English   中英

我可以使變量全局可見,而不必在每個PHP類的構造函數中聲明它是全局的嗎?

[英]Can I make a variable globally visible without having to declare it global in every single PHP class's constructor?

我有一個數據庫類,其實例在主index.php聲明為

$db = new Database();

是否有一種方法可以在所有其他類中全局識別$db變量,而無需聲明

global $db;

在每個類的構造函數中?

不。您必須在每個類的構造函數中聲明Global $ db。

或者您可以使用全局數組:$ _GLOBALS ['vars'];

解決這個問題的唯一方法是使用靜態類來包裝它,稱為Singleton方法 (請參閱此處獲取解釋)。 但這是非常糟糕的做法。

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

創建單例方法是為了確保只有一個類的實例。 但是,因為人們將它用作快捷方式的一種方式,所以它被稱為懶惰/糟糕的編程。

StackOverflow知識
如何避免使用PHP全局對象
在不使用Globals的情況下在PHP中的函數之間共享變量
為類中的每個函數創建全局變量
用於數據庫連接的全局或單例

我做的有點不同。 我通常有一個全局應用程序對象(App)。 在該對象中,我做了一些基本的初始化,比如創建我的db對象,緩存對象等。

我還有一個返回App對象的全局函數....因此(應用程序對象定義未顯示):

define('APPLICATION_ID', 'myApplication');

${APPLICATION_ID} = new App;

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

那么我可以在任何代碼中的任何地方使用類似的東西來引用全局對象中的對象:

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

它並不完美,但我發現它可以在許多情況下使事情變得更容易。

你可以用

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

或者使用某種單獨訪問方法

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

為什么不創建一個包含global $db; 在它的構造函數中,然后擴展所有其他類?

您可以使用Registry類來存儲和檢索Database實例。

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');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM