以免假設我有以下嵌套函數拋出時外被稱爲不止一次
function a(){
function b(){}
}
a(); //pass
a(); //error
爲什麼在第二次調用一個異常被拋出一個異常,它說
cannot re-declare function b()
我認爲每個函數調用都會創建一個新的活動記錄,它包含它自己的範圍; 像其他語言一樣,PHP當我們在函數中聲明一個變量並調用該函數時,所有變量都爲其作用域保持活動,爲什麼內部函數不一樣?
以免假設我有以下嵌套函數拋出時外被稱爲不止一次
function a(){
function b(){}
}
a(); //pass
a(); //error
爲什麼在第二次調用一個異常被拋出一個異常,它說
cannot re-declare function b()
我認爲每個函數調用都會創建一個新的活動記錄,它包含它自己的範圍; 像其他語言一樣,PHP當我們在函數中聲明一個變量並調用該函數時,所有變量都爲其作用域保持活動,爲什麼內部函數不一樣?
命名函數在PHP中總是全局的。因此,您需要檢查是否函數B已經創建:
function A() {
if (!function_exists('B')) {
function B() {}
}
B();
}
不同的解決方案是使用一個匿名函數(這將更有可能滿足您的需求,作爲函數現在存儲在一個變量,因此本地到A的功能範圍):
function A() {
$B = function() {};
$B();
}
這是因爲當你執行函數a
它聲明函數b。再次執行它重新聲明它。您可以使用function_exists
函數修復此問題。
function a(){
if(!function_exists('b')){
function b(){}
}
}
但是我建議的是,你應該在外面聲明函數。不在裏面。
它究竟是說,當你調用a()
再次嘗試重新聲明b()
,申報a()
b()
之外,從a()
中調用b()
像這樣:
function a() {
b();
}
function b() {}
a();
a();
這是因爲你在呼喚a()
全球範圍。添加一個function_exists
調用以使上述代碼正常工作,但實際上有幾種情況您應該真的這樣做。
在另一個函數中聲明一個函數就像在php中被認爲是不好的做法。如果你確實需要一個()內的函數,你應該創建一個閉包。
function a() {
$b = function() {
};
}
請不要在函數中添加函數。這幾乎是不需要的。 – PeeHaa 2012-08-15 10:53:35
可能重複的[如何在PHP中定義本地函數?](http://stackoverflow.com/questions/7465451/how-to-define-local-functions-in-php) – kenorb 2015-05-18 22:23:24