2017-10-06 19 views
-1

按上未設置()函數的PHP文件:爲什麼像unset()這樣的行爲在全局變量的情況下對其他操作也不一樣?

的未設置()函數的內部可根據您正試圖銷燬的變量的類型而異的行爲。 如果一個全局變量在函數內部是unset(),那麼只有局部變量被銷燬。調用環境中的變量將保持與調用unset()之前相同的值。

的代碼示例演示上面說的是如下:

<?php 
function destroy_foo() 
{ 
    global $foo; 
    unset($foo); 
} 

$foo = 'bar'; 
destroy_foo(); 
echo $foo; // o/p is bar 
?> 

現在我的問題是,爲什麼上述行爲並不適用於以下我寫程序?

<?php 
function increment_foo() 
{ 
    global $foo; 
    $foo++; 
} 

$foo = 36; 
increment_foo(); 
echo $foo; // o/p is 37 
?> 

我的疑問是,爲什麼行爲是在上面的代碼比unset()功能寫在代碼的行爲有什麼不同?

換句話說,我希望在第一代碼知道unset()功能仍然僅限於函數內部的局部變量,它不會改變功能之外,但我一直在寫的代碼在全球範圍內的值增量功能也會更改全局變量作用域中的值。在我的代碼中,爲什麼它不會侷限於函數內部的局部變量,並且改變函數外部的變量值/影響變量?

謝謝。

+0

似乎是一個範圍問題 – rtfm

+1

這就是它是如何工作的以及它是如何記錄的。除此之外,我覺得這很合乎邏輯:它就像是對全局變量的引用,因此取消設置它,取消引用並修改它會更改全局變量。真正的問題是爲什麼你會使用全局變量;-) – jeroen

回答

2

這樣做的原因是,使用global關鍵字將創建一個局部變量引用在全球範圍內的變量。取消設置只會破壞這個參考。它類似於這段代碼:

$foo = 42;  // create variable with value 
$bar = &$foo; // create reference to $foo 
$bar++;   // increment $foo via reference 
unset($bar); // destroy reference 

var_dump($bar); // NULL 
var_dump($foo); // 43 

另一種方式把它是做global $foo只是一個簡寫做$foo = &$GLOBALS['foo'],例如第一個例子可以改寫爲

function increment_foo() 
{ 
    $foo = &$GLOBALS['foo']; 
    $foo++; 
    unset($foo); 
    var_dump($foo); // NULL 
} 

$foo = 42; 
increment_foo(); 
var_dump($foo); // 43 

也許這樣會更明顯,你只是在摧毀引用,你正在銷燬$foo,但不是$foo本身。

相關問題