如何处理关键字静态

时间:2016-09-14 12:02:24

标签: php

我做了一些测试,我得到了......看看这个:

首先

function a()
{
    static $number = 0;
    echo "[".$number."]";
    $number++;
    echo "-[".$number."]\n";
}
a();
a();
a();

结果:

[0]-[1] [1]-[2] [2]-[3]

第二

$digit = 10;
function a()
{
    static $number = 0;
    echo "[".$number."]";
    $number = &$GLOBALS["digit"];
    $number++;
    echo "-[".$number."]\n";
}
a();
a();
a();

结果:

[0]-[11] [0]-[12] [0]-[13]

第三

$digit = 10;
function a()
{
    static $number = 0;
    $number++;
    echo "[".$number."]";
    $number = &$GLOBALS["digit"];
    echo "-[".$number."]\n";
}
a();
a();
a();

结果:

[1]-[10] [2]-[10] [3]-[10]

第四:

$digit = 10;
function a()
{
    static $number = 0;
    $number++;
    echo "[".$number."]";
    unset($number);
    $number = &$GLOBALS["digit"];
    echo "-[".$number."]\n";
}
a();
a();
a();

结果:

[1]-[10] [2]-[10] [3]-[10]

请解释一下,为什么这样工作呢?我不明白为什么当我们调用next函数时静态变量被重置(第二个例子)。为什么在第三个例子中静态变量没有被重置,但是当我们再次调用函数时,我没有从$ GLOBALS获得值(除了我看不到第三个例子和第四个例子之间的区别)。解释任何人。

1 个答案:

答案 0 :(得分:1)

这个问题实际上只是缺乏理解PHP variable scope,涵盖static function variablesreferences in PHP

第一

在您的第一个示例中,这是所有正常和预期的行为。静态函数变量在编译时初始化一次。在脚本结束之前,对函数内部值的任何更改都将保留。因此,在函数返回后它们不会重新初始化,就像正常的局部变量一样。

第二

在第二个示例中,您只是更改全局$digit变量的值,因为您通过引用全局变量$number重新分配局部变量$digit。因此,在函数中说global $digit; $number = &$digit;与此相同。它将全局变量导入函数的本地范围。

注意,这不会重置静态初始化值。该值始终为0且永远不会更改。请注意下面的例子会做什么。

$digit = 10;
function a()
{
    static $number = 0;
    echo "[".$number."]";
    $number++;
    // this by reference assignment doesn't change the static $number value PHP remembers
    $number = &$GLOBALS["digit"];
    $number++;
    echo "-[".$number."]\n";
}
a();
a();
a();
[0]-[11]
[1]-[12]
[2]-[13]

第三

您通过导入全局变量来做同样的事情,但是在您将其重新指定为{{1的引用之前'之前,您恰好会增加局部变量$number的值。来自全球范围。

与三个相同。 $digits此处无效。 PHP并没有忘记静态变量unset($number)的值,因为您将其从函数的本地范围中删除。静态初始化的值保留在PHP的内存中,直到脚本结束。从技术上讲,您可以通过引用重新分配局部变量,就像在示例二和三中一样,并且在编译时初始化的$number的值仍然存在。

相关问题