2012-06-23 82 views
2

沒有使用關鍵字global關鍵字在PHP中以Java stlye方式使用全局變量的另一種方法嗎?PHP全局關鍵字解決方法

下面的例子是非常常見和簡單的東西。我會用define這個關鍵字來做,但是你可以看到,這些varibales是相互依賴的,我相信你不能通過define來達到這個目的。

在下面的例子中,我收到了一個錯誤,當然。

真的期待這個解決方案。在我看來,必須寫一個global定義,我希望使用全局變量的功能看起來是一個無效的解決方案,應該是一個更好的解決方案。

$BASE_URL = "mysite.com"; 
$PRODUCTS_URL = $BASE_URL . "/products"; 
$ABOUT_URL = $BASE_URL . "/about"; 

function foo() { 
    echo $BASE_URL; 
} 

回答

1

我會用define關鍵字來做,但正如你所看到的,varibales是相互依賴的,我相信你不能用define來實現。

並不完全正確,這會工作得很好 - 這是我可能會接近這個方法:

define('BASE_URL', "mysite.com"); 
define('PRODUCTS_URL', BASE_URL . "/products"); 
define('ABOUT_URL', BASE_URL . "/about"); 

只是要小心吃起來恆的命名空間,你可能想編寫一個函數,而不是也許是這樣的(可以使用的調整,只是一個例子):

function get_url($item = NULL, $include_base = TRUE) 
{ 
    $urls = array(
     'base' => 'mysite.com', 
     'products' => '/products', 
     'about' => '/about', 
    ); 
    $output = $include_base ? $urls['base'] : ''; 
    if (isset($urls[$item])) $output .= $urls[$item]; 
    return $output; 
} 

然後調用它像echo get_url('products');。只要調用foo()時定義了它,它就會起作用。我會一直努力避免global$GLOBALS

1

您可以使用$ globals這個如下...

function foo() { 
    echo $GLOBALS['BASE_URL']; 
} 

但是 - 見下文Kolink的評論。從PHP 5.4.0 $ GLOBALS superglobal僅在首次使用時初始化,因此在不使用它並且堅持使用global關鍵字的情況下有一個邊際性能優勢。

對於你正在做的事情,你可以簡單地定義一個單一的全局數組,例如,

$CONF['BASE_URL']='foo'; 

然後你只需要在需要它的,或更好的任何功能使用global $CONF的是,它包裝成某種配置類的。

+1

請注意'$ GLOBALS'數組是在PHP 5.4中實時添加的。在這種情況下,僅僅爲了避免指定'global $ myvar'就可能是低效率的。 –

+0

有趣 - 如果有人需要參考,請參閱5.4.0的更新日誌http://php.net/ChangeLog-5.php#5.4.0 –

0

你甚至可以使用$_SESSION但不是一個非常優雅的解決方案。 爲什麼你很難輸入global?這並不是很大的衝擊。

define()也不錯。