Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么全局变量的unset()行为与其他操作的行为不一样?_Php_Function_Scope_Global Variables_Superglobals - Fatal编程技术网

Php 为什么全局变量的unset()行为与其他操作的行为不一样?

Php 为什么全局变量的unset()行为与其他操作的行为不一样?,php,function,scope,global-variables,superglobals,Php,Function,Scope,Global Variables,Superglobals,根据关于unset函数的PHP文档: 函数内部unset的行为可能因尝试销毁的变量类型而异。 如果在函数内部未设置全球化变量,则只销毁局部变量。调用环境中的变量将保留与调用unset之前相同的值 演示上述说法的代码示例如下所示: <?php function destroy_foo() { global $foo; unset($foo); } $foo = 'bar'; destroy_foo(); echo $foo; // o/p is bar ?> 现

根据关于unset函数的PHP文档:

函数内部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
另一种说法是,doing global$foo只是doing$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本身。

似乎是一个范围问题,这就是它的工作方式和记录方式。除此之外,对我来说,这似乎很合乎逻辑:它就像对全局变量的引用,因此取消对它的设置,取消对引用的设置,并修改它来更改全局变量。真正的问题是为什么要使用全局变量-