为什么在全局变量的情况下像 unset() 这样的行为对于其他操作也不一样?

Why does the behavior like unset() in case of global variables is not the same for other operations too?

根据关于 unset() 函数的 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() 功能仍然限于函数内部的局部变量,它不会更改函数外部全局范围内的值,而是在代码中我已经写过增量功能也会更改全局变量范围内的值。在我的代码中,为什么它不限于函数内的局部变量并改变 value/affecting 函数外的变量?

谢谢。

原因是使用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'] 的 shorthand,例如第一个例子可以重写为

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

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

也许这让你更明显地知道你只是在破坏参考,例如你正在破坏指向 $foo 的东西,而不是 $foo 本身。