php+静态变量的作用,PHP 作用域和静态变量 忽略的细节

function test(){

static $a = 0;

$a++;

echo “before unset “.$a.”
”;

unset($a);

$a = 23;

echo “after unset “.$a.”
”;

}

echo “第一次执行
”;

test(); //执行一次

echo “第二次执行
”;

test();

echo “第三次执行
”;

test();

看到这题的候,就注意到了static这个标记了$a。就知道这题不会是第一反应的结果。(结果如下)

6da272a54c20c320ea7d369002d14636.png

这个$a 值没有因为unset() 函数改变,而是一直在累计!!我知道unset()对应static状态的变量是无效的。我马上查看了手册

unset()销毁指定的变量。

unset()在函数中的行为会依赖于想要销毁的变量的类型而有所不同。

如果在函数中 unset()一个全局变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用 unset() 之前一样的值。

如果在函数中 unset()一个静态变量,那么在函数内部此静态变量将被销毁。但是,当再次调用此函数时,此静态变量将被复原为上次被销毁之前的值。

其实这样这么理解:

6b5609707627b1e3acae1011e80341dd.png

PHP的内存地址跟变量直接就是通过上图的方式进行关联的。

一般的变量是是通过关联的方式指向对应的地址,而不是真是的值。

所以unset()的过程,其实是断了之间的联系,而不是抹掉了内存地址的值。

static在初始化变量的,仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。

所以才看到之前累加的情况出现。而且静态变量在生命周期内只能赋值一次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值