2012-08-15 45 views
4

以免假設我有以下嵌套函數拋出時外被稱爲不止一次

function a(){ 
    function b(){} 
} 
a(); //pass 
a(); //error 

爲什麼在第二次調用一個異常被拋出一個異常,它說

cannot re-declare function b() 

我認爲每個函數調用都會創建一個新的活動記錄,它包含它自己的範圍; 像其他語言一樣,PHP當我們在函數中聲明一個變量並調用該函數時,所有變量都爲其作用域保持活動,爲什麼內部函數不一樣?

+3

請不要在函數中添加函數。這幾乎是不需要的。 – PeeHaa 2012-08-15 10:53:35

+0

可能重複的[如何在PHP中定義本地函數?](http://stackoverflow.com/questions/7465451/how-to-define-local-functions-in-php) – kenorb 2015-05-18 22:23:24

回答

7

命名函數在PHP中總是全局的。因此,您需要檢查是否函數B已經創建:

function A() { 
    if (!function_exists('B')) { 
     function B() {} 
    } 
    B(); 
} 

不同的解決方案是使用一個匿名函數(這將更有可能滿足您的需求,作爲函數現在存儲在一個變量,因此本地到A的功能範圍):

function A() { 
    $B = function() {}; 
    $B(); 
} 
+0

非常感謝先生,但一個問題,在第一次調用()之後,我們可以全局訪問B()嗎?正如你所說的「命名函數總是全局的」 – Hilmi 2012-08-15 11:14:41

+0

第一種方法,是的。檢查'if(!function_exists('B'))'只是防止在第二次調用A時重新聲明。使用第二種方法,您可以創建一個非全局函數(它存儲在一個變量,因此其行爲與其他變量一樣)。 – Niko 2012-08-15 11:21:08

+0

非常感謝,非常有幫助 – Hilmi 2012-08-15 11:23:49

4

這是因爲當你執行函數a它聲明函數b。再次執行它重新聲明它。您可以使用function_exists函數修復此問題。

function a(){ 
    if(!function_exists('b')){ 
    function b(){} 
    } 
} 

但是我建議的是,你應該在外面聲明函數。不在裏面。

1

它究竟是說,當你調用a()再次嘗試重新聲明b(),申報a()b()之外,從a()中調用b()像這樣:

function a() { 
    b(); 
} 

function b() {} 

a(); 
a(); 
0

這是因爲你在呼喚a()全球範圍。添加一個function_exists調用以使上述代碼正常工作,但實際上有幾種情況您應該真的這樣做。

1

在另一個函數中聲明一個函數就像在php中被認爲是不好的做法。如果你確實需要一個()內的函數,你應該創建一個閉包。

function a() { 
    $b = function() { 

    }; 
} 
相關問題