2010-05-30 56 views
0

是否有可能使所有功能的變量全球,而不是像global $a, $b, $c...鍵入所有變量?所有功能的變量是全球

+0

Ouch。這是一種反模式,考慮明確地將變量傳遞給函數/類。 – nuqqsa 2010-05-30 21:06:34

+1

您能否提供更多關於爲什麼以及在何種情況下的信息?我一直在撓頭,試圖理解爲什麼你會有一箇中心功能需要全局功能。 – allnightgrocery 2010-05-30 21:08:48

+4

@Inkspeak:你還可以爲http://thedailywtf.com/編寫代碼嗎? – 2010-05-30 21:10:44

回答

1

您可以隨時使用$GLOBALS["var"],而不是$var。當然,如果你需要這個,你很可能做錯了。

3

不,不管怎麼說,這是一件可怕的事情。

+0

爲什麼可怕?你能證明這個嗎?我需要這個用於我的一個功能。 – 2010-05-30 21:06:17

+1

你只需要它,因爲你的設計的其餘部分很糟糕。如何將所需的所有數據封裝在對象中,而不是用它們來污染全局變量空間? – 2010-05-30 21:11:11

+0

關於馬蒂,你是指一種方法,比如我上面的帖子! – RobertPitt 2010-05-31 16:06:51

2

您可以將它們作爲參數,然後你將不需要0​​關鍵字:

function(&$a, &$b, &$c) 
{ 
// your code........ 
} 
+3

你必須通過引用來傳遞它們。 – Artefacto 2010-05-30 21:27:09

+0

@Artefacto。好決定。但IMO將參數轉換爲「出參數」並不比首先使用全局變量更好。也許更糟糕的是,如果你閱讀調用該函數的那一行,你就沒有提示該函數可以修改這個參數。 – 2010-05-30 22:02:57

+0

@Juan Pablo Califano:在此基礎上達成一致,使用全局關鍵字應該是最佳選擇。 – Sarfraz 2010-05-30 22:14:06

4

試試你的應用程序中創建靜態對象,並以該範圍分配變量,就像這樣!

<?php 
/* 
    * Core class thats used to store objects of ease of access within difficult scopes 
*/ 
class Registry 
{ 
    /* 
     * @var array Holds all the main objects in an array a greater scope access 
     * @access private 
    */ 
    private static $objects = array(); 

    /** 
     * Add's an object into the the global 
     * @param string $name 
     * @param string $object 
     * @return bool 
    */ 
    public static function add($name,$object) 
    { 
     self::$objects[$name] = $object; 
     return true; 
    } 

    /* 
     * Get's an object out of the registry 
     * @param string $name 
     * @return object on success, false on failure 
    */ 
    public static function get($name) 
    { if(isset(self::$objects[$name])) 
     { 
      return self::$objects[$name]; 
     } 
     return false; 
    } 

    /** 
     * Removes an object out of Registry (Hardly used) 
     * @param string $name 
     * @return bool 
    */ 
    static function remove($name) 
    { 
     unset(self::$objects[$name]); 
     return true; 
    } 

    /** 
     * Checks if an object is stored within the registry 
     * @param string $name 
     * @return bool 
    */ 
    static function is_set($name) 
    { 
     return isset(self::$objects[$name]); 
    } 
} 
?> 

考慮到這文件是包括可以設置任何對象/陣列/可變/資源/等進入這個範圍所述第一文件中的一個。

因此,可以說,你剛剛作出了一個DB連接,這是你用藿它

... 
$database = new PDO($dns); 

Registry::add('Database',$database); 

$DBConfig = Registry::get('Database')->query('SELECT * FROM config_table')->fetchAll(PDO::FETCH_CLASS); 
Registry::add('Config',$DBConfig); 

沒有腳本中的其他地方,你可以添加或檢索項目。

Registry::get('ITEM_NEEDED');

這將在方法等多種功能

完美的例子,工作

function insertItem($keys,$values) 
{ 
    Registry::get('Database')->query('INSERT INTO items ('.implode(',',$keys).') VALUES ('.implode(',',$values).')'); 
} 

希望它可以幫助

+1

我的意思不是粗魯,但這幾乎是所有使用全局的問題,除了需要更多的輸入(這似乎是OP的主要問題)。 – 2010-05-30 21:58:07

+0

這是我喜歡做事情的方式,如果您有更好的解決方案,請隨時發佈。 – RobertPitt 2010-05-30 22:00:51

+0

這很好,你的答案是完全有效的。我的意思是依靠全球狀態來傳遞數據可能會變得很容易出問題。我寧願使用參數並返回值。 – 2010-05-30 22:11:52