2012-08-15 39 views
-1

可能重複:不存在的功能欄上
nested functions in php throws an exception when the outer is called more than once嵌套函數的怪事

爲什麼

function foo(){ 
    function bar(){ 
    }  
} 
bar(); 

返回致命錯誤

function foo(){ 
    function bar(){ 
    }  
} 
foo(); 
foo(); 

給bar()的重複聲明帶來致命錯誤?

確實將php函數作爲全局函數或父函數作用域來處理?

+0

如你所說...全球! – 2012-08-15 19:53:49

+0

請參閱PHP手冊,它非常好地解釋了這種情況。手冊頁在這裏:http://php.net/manual/functions.user-defined.php,見例3 *函數內的函數*。 - 這些函數在他們的例子中甚至有相同的名字! – hakre 2012-08-15 19:59:25

+0

[RTFM](http://php.net/manual/en/functions.user-defined.php#example-147) – salathe 2012-08-15 20:05:03

回答

4

函數本身在全局範圍內定義,即使它是在另一個函數內定義的。在第一種情況下,如果您在bar()之前沒有撥打foo(),則bar()將不存在。

你可以用function_exists()測試創建前:

function foo(){ 
    // Don't redefine bar() if it is already defined 
    if (!function_exists("bar")) { 
     function bar(){ 
     }  
    } 
} 

然而,由於嵌套函數是作用域外功能,使用情況定義另一個函數內部功能比較有限。此外,它會在您的代碼中引入一些可能難以理解和維護的奇怪副作用。考慮你是否真的想這樣做,並在必要時重新考慮你這樣做的理由。如果您正在尋找的是範圍限制,您可能更適合namespacesclasses/objects

2

功能是總是創建在全球範圍內,但只有當他們的定義執行。

+1

你能解釋一下在PHP中「執行定義」的含義嗎? – hakre 2012-08-15 20:07:43

0

函數「inside」僅在調用外部函數時聲明。

在第一個示例中,您不調用foo(),因此bar()從不聲明。

在第二個示例中,您撥打foo()兩次,因此bar()被聲明瞭兩次。

0

在第一個示例中,在函數foo中聲明bar。因此,如果沒有首先調用foo,調用bar是沒有意義的,因爲它的定義尚未執行。在第二個示例中,您要撥打foo兩次,以使bar函數被聲明兩次。