2011-08-20 47 views
4

這是一個解決方案,用於解決任何地方都無法找到答案的問題。它涉及全局變量範圍和多個功能。PHP多封裝函數全局變量範圍

基本上,我想要一個函數聲明變量,然後有第二個嵌套函數使用這些變量。當腳本聲明變量並在聲明global $var1, $var2;之後調用使用這些變量的函數時,此工作正常。

但是,我遇到嵌套函數看到父函數聲明的變量的問題,使用與調用函數的腳本相同的代碼邏輯。

解決的辦法是寫:

function function_1(){ 
    global $var1, $var2; 
    $var1=0; 
    $var2=0; 
    function function_2(){ 
    global $var1, $var2; 
    } 
    function_2();//call to nested function. 
} 

所有變量在這種情況下,正確的交互。

如果在聲明function_1中的變量後聲明'global',那麼只需清除變量的值(即聲明沒有值的新變量?)。

希望這可以幫助別人:)

格雷格

+0

可以發佈代碼嗎? – xsari3x

+0

事情是內部函數在全局範圍內結束。在PHP中,您可以使用匿名(內部)函數或類來實現您想要的內容。 –

回答

0

你應該使用封閉: 功能function_2使用($ VAR1,$ VAR2)(){}

1

不要使用全局變量。使用use ($var1,$var2)所以你並不需要全球化的變量

0

爲了說明什麼起源說的話,請執行下列操作:

function func1($a, $b) // <-- function DEFINITION for func1 
{ 
    // do stuff wit $a and $b 

    func2($a, $b); // <-- function INVOCATION of func2 within func1 
} 

func2($y, $z) // <-- function DEFINITION for func2 
{ 
    // do stuff with $y and $z 
} 

// -------------------------------- 

$param1 = "some value"; 
$param2 = "some other value"; 

func1($param1, $param2); // <-- explicit INVOCATION of func1... func2 is also invoked within 

決不使用「全局」關鍵字參數傳遞給函數。函數有一個理由的參數列表。

+0

我會重新探討關閉的想法。我第一次嘗試使用參數,但它不適合我。函數2正在更新函數1在調用函數2時使用的變量。我需要從函數2中獲取更新變量的值,而不使用「返回」。 – Greg

+1

你有沒有嘗試過將它們傳遞給Function 2? PHP中用於傳遞給函數的變量的默認機制是通過值。這意味着變量的COPY被創建並傳遞給函數。這就是爲什麼如果您希望保留更改,則需要返回值 - 副本是已更改的內容,如果未返回,則隨着函數結束並且其作用域中的所有內容都被銷燬,它將被銷燬。 –

+1

通過引用傳遞意味着您將變量的引用傳遞給該函數。無論你對函數中的變量做出什麼樣的改變,都會被保留在函數之外,從而不需要返回新的值。 –