【问题标题】:Why does the behavior like unset() in case of global variables is not the same for other operations too?为什么在全局变量的情况下 unset() 的行为对于其他操作也不相同?
【发布时间】:2017-10-06 07:10:31
【问题描述】:

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

谢谢。

【问题讨论】:

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

标签: php function scope global-variables superglobals


【解决方案1】:

这样做的原因是使用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 = &amp;$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 本身。

【讨论】:

    猜你喜欢
    • 2019-05-31
    • 1970-01-01
    • 2017-10-03
    • 2018-05-17
    • 2019-02-25
    • 1970-01-01
    • 2023-01-08
    • 2021-09-07
    • 2013-05-16
    相关资源
    最近更新 更多