如何工作关键字静态


How to work keyword static

我做了一些测试,我得到的是…看这个:

:

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]

请告诉我为什么这样有效?我不明白为什么当我们调用下一个函数静态变量是重置(第二个例子)。为什么在第三个例子中静态变量没有重置,但当我们再次调用函数时,我没有从$GLOBALS中获得值(此外,我没有看到第三个例子和第四个例子之间的差异)。解释任何人。

这个问题实际上只是缺乏对PHP变量作用域的理解,它包括静态函数变量和PHP中的引用。

<标题>第一h1> 您的第一个示例中,这是所有正常和预期的行为。静态函数变量在编译时初始化一次。在函数内对其值的任何更改都会保留,直到脚本结束。所以它们不会在函数返回后重新初始化,就像普通的局部变量那样。 <标题> 第二

在第二个示例中,您只更改了全局$digit变量的值,因为您通过引用全局变量$digit重新分配了局部变量$number。这和函数中的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]之前<标题> 第三

你通过导入全局变量做了同样的事情,但你只是碰巧增加了局部变量$number的值,首先,在你从全局作用域将它作为$digits的引用重新赋值之前。

<标题>第四h1> 3一样。unset($number)在这里不起作用。PHP不会因为将静态变量$number从函数的局部作用域中删除就忘记它的值。静态初始化的值将一直保存在PHP的内存中,直到脚本结束。因此,从技术上讲,您可以通过引用重新分配局部变量,就像在示例2和示例3中所做的那样,并且在编译时初始化的$number的值仍然保留。