[英]Accessing a global variable inside nested functions
這是我的情景:
$foo = bar;
one()
{
two()
{
three()
{
// need access to $foo here
}
}
}
我知道我可以將$ foo傳遞給所有三個函數,但這並不是很理想,因為您可能需要也可能不需要它,此外,已經有其他參數,如果可以的話,我不想添加到該列表中防止它。 只有當您達到three()
時,才需要$foo
。 我知道我也可以指定global $foo;
在three()
,但是我讀到這不是一個好習慣。
有沒有另一種方法可以使three()
可以使用$foo
而不進行任何操作?
為了提供更多信息,在這種情況下,$ foo是有關如何連接到數據庫的信息,例如服務器,用戶,密碼,但實際上只有在three()
中才需要該信息。 當然,我可以在文檔加載時立即連接到數據庫,但是如果文檔可能不需要它,則感覺沒有必要。
有任何想法嗎?
更新 :很抱歉,我並不是要在每個函數的開頭都包含“函數”,這意味着我是通過嵌套方式創建它們的。
是的,您可以使用global
,也可以將其作為參數傳遞。 兩者都是公平的方式。 但是,我會選擇后者。 或者,您也可以使用閉包和use
關鍵字:
$foo = 'bar';
$one = function() use($foo) {
$two = function() use($foo) {
$three = function () use($foo) {
// access to $foo here
};
};
};
如果需要在$three()
內修改頂部$foo
的值,也可以use(&$foo)
$three()
如果使用得當,使用global
並不是一個壞習慣。 這種情況下,您將使用global
,這將是完全可以的。
由於global
make函數可以訪問全局變量,因此存在數據損壞的風險。 只要確保謹慎使用,您就知道自己在做什么(即,不小心更改了不希望更改的數據。這有時會導致一些難以跟蹤的討厭的錯誤。)
總結:在這種情況下, global
是完美的。
真正糟糕的是嵌套函數,至少在PHP中是如此。
不要聽任何談論global
。
閱讀有關OOP的書籍(例如this ),閱讀有關依賴注入,工廠模式的書籍。
依賴注入是創建靈活且易於維護的代碼的最佳方法,並且通過DI哲學,您將在參數中從第一個函數傳遞到第三個函數$ foo,或者將帶有所有必需變量的Context對象傳遞(如果您希望最小化計數)的論點)。
有關DI的更多信息,您可以在這里閱讀: http : //components.symfony-project.org/dependency-injection/trunk/book/00-Introduction
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.