php 静态变量的本质?

<?php

function testStatic() {
static $val = 1;
echo $val;
$val++;

}

testStatic();   //output 1
testStatic();   //output 2
testStatic();   //output 3
echo $val; //output nothing
echo '<hr/>';
function testStatic2() {
    global $val2;
    $val2++;
    echo $val2;
}
testStatic2();   //output 1
testStatic2();   //output 2
testStatic2();   //output 3
echo $val2; //3
echo '<hr/>';

?>

网上查了很多资料,感觉都没讲到根本.只是手册中提到过引用一词但也并无详述.此代码的对比也只是表达我个人的理解.个人对静态变量的理解是:静态局部变量与global极为相似,都是代表引用,只不过被引用的变量不可访问而已!而此代码static $val=1代表第一次函数执行时同时创建
局部变量$val和静态区的变量$val,局部$val引用静态区的$val,并且静态区$val赋初值为1,后续每次调用函数,就创建新的局部$val并直接引用静态区$val,不赋初值,但是不能在函数外面访问静态区的$val 问题就是静态局部变量是这么回事吗?

阅读 4.1k
3 个回答

引用s7634800的图 1428940578_779960.jpg 在作用域范围内的静态变量常驻内存,在多次调用的时候静态变量不会被重置

这个问题做一个实验就很清晰了

$age=0;
$age++;
function test1() {
    static $age = 100;
    $age++;
    echo $age;  //output 101
}
function test2() {
    static $age = 1000;
    $age++;
    echo $age; //output 1001
}
 
test1(); //输出101
echo "<br>";
test2();//输出1001
echo "<br>";
echo $age;//输出1
echo "<br>";
test1();//输出102
echo "<br>";

可以看出三个$age之间是互不干扰的,这就说明static修饰的变量作用域是不同的,PHP中有两个作用域,一个是全局作用域,一个是函数作用域,global修饰的变量作用域是全局,而static修饰的变量则是函数范围内有效。

楼上的图片解释的很到位了,你只需要记着:静态变量会保存上一次执行的结果,而普通变量多次执行会被覆盖即可。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题