为什么在全局变量的情况下像 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
本身。
根据关于 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
本身。