2010-11-15 21 views
6

爲什麼PHP允許嵌套函數?嵌套PHP函數:爲了什麼目的?

<?php 
function foo() { 
    function bar() { 
     return "bar"; 
    } 
    return "foo"; 
} 
print foo(); 
print bar(); 

..是有效的PHP。

但是:

  1. 爲什麼會沒有需要嵌套?即使如此,爲什麼我可以從任何地方調用bar(而不是,例如只用foo()或trough foo.bar()等)。

我今天遇到了這個,因爲我忘了一個閉合支架的某個地方,並且還有一個更多的下降。該代碼是有效的,沒有錯誤拋出;但這一切開始表現得很奇怪。函數沒有被聲明,回調會瘋狂等等。 這是一個功能,如果是這樣,爲了什麼目的?還是一些特質?

答案:評註者指出,這是一個複製的What are php nested functions for

+1

可愛。好像PHP需要另一個原因來獲得仇恨... – 2010-11-15 17:29:10

+1

已經很好地覆蓋了:[可能是[爲什麼是PHP嵌套功能?]的重複(http://stackoverflow.com/questions/415969/what-are- php-nested-functions-for) – meagar 2010-11-15 17:30:09

+3

另外,僅僅因爲你不明白的東西並不會使它成爲「idiocracy」,這不是一個字。 – meagar 2010-11-15 17:32:31

回答

7

請注意,這裏的順序很重要;在你的例子中調用foo()之前你不能調用bar()。這裏的邏輯似乎是foo()的執行定義了bar()並將其放在全局範圍內,但由於範圍的限制,它在執行foo()之前未定義。

這裏的使用將是一種原始形式的函數重載;您可以讓bar()函數根據foo()聲明的版本執行不同的操作,假設每個不同版本的foo()確實定義了bar()函數。

+2

我想知道當'foo()'被調用時會發生什麼第二次。有人會認爲會拋出一個錯誤,因爲bar()已經被定義了。 – dnagirl 2010-11-15 17:37:45

+2

@dnagirl:它確實:致命錯誤:func。已經定義。 – berkes 2010-11-15 17:40:37

6

在PHP中,您可以有條件地定義函數,運行時常量和甚至類。這允許您根據具體情況定義不同的函數/常量/類。

簡單舉例:定義String\Length函數,具體取決於在應用程序中打開還是關閉多字節支持。

namespace String; 

if (\MULTIBYTE_MODE) { 
    function Length($string) { 
     return strlen($string); 
    } 
} else { 
    function Length($string) { 
     return mb_strlen($string); 
    } 
} 

嵌套函數只是條件函數定義的特例。

相關問題