簡體   English   中英

在嵌套函數內部訪問全局變量

[英]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.

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