为什么像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()
功能仍然仅限于函数内部的局部变量,它不会改变功能之外,但我一直在写的代码在全球范围内的值增量功能也会更改全局变量作用域中的值。在我的代码中,为什么它不会局限于函数内部的局部变量,并且改变函数外部的变量值/影响变量?
谢谢。
答
这样做的原因是,使用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
本身。
似乎是一个范围问题 – rtfm
这就是它是如何工作的以及它是如何记录的。除此之外,我觉得这很合乎逻辑:它就像是对全局变量的引用,因此取消设置它,取消引用并修改它会更改全局变量。真正的问题是为什么你会使用全局变量;-) – jeroen