我做了一些测试,我得到的是…看这个:
:
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
的引用重新赋值之前。
unset($number)
在这里不起作用。PHP不会因为将静态变量$number
从函数的局部作用域中删除就忘记它的值。静态初始化的值将一直保存在PHP的内存中,直到脚本结束。因此,从技术上讲,您可以通过引用重新分配局部变量,就像在示例2和示例3中所做的那样,并且在编译时初始化的$number
的值仍然保留。
标题>标题>标题>标题>