我做了一些测试,我得到了......看看这个:
首先
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获得值(除了我看不到第三个例子和第四个例子之间的区别)。解释任何人。
答案 0 :(得分:1)
这个问题实际上只是缺乏理解PHP variable scope,涵盖static function variables和references 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
的值仍然存在。