当前位置: 首页 > 技术随笔 > PHP在函数内unset()静态变量的细节

PHP在函数内unset()静态变量的细节

在PHP关于unset()函数的官方说明文档中,有如下一段说明:

如果在函数中unset()一个静态变量,则unset()将销毁此变量及其所有的引用。

并配有对应的具体示例代码,如下:

<?php
function foo() {
    global $a;
    $a++;
    echo "$a\n";
    unset($a);
    //echo $a;	#如果在这里再次输出$a,将会提示该变量未定义
}

foo();
foo();
foo();
?>

上述的例子将输出如下:

1
2
3

对于上述代码,可能许多PHP初学者无法理解:上面不是说,在函数中unset()一个静态变量,就会销毁此变量及其所有引用,为什么3次调用函数foo(),得到的结果却不一样,并且输出结果与没有unset($a);这行代码的输出结果一样,都实现了计算累加。这里应该如何理解呢?

实际上,在PHP中,函数中定义的静态变量,是存放在静态内存区域的,函数中的静态变量可以看作是对该内存地址的一个引用。

因此,上面的代码可以分解为类似如下代码来理解:

<?php
$a;	//变量$a实际在静态内存区域中,除了foo()函数内,其他地方无法直接访问
function foo() {
    global $a;
    $a++;
    echo "$a\n";
    unset($a);
}

foo();
foo();
foo();
?>

这样,我们就可以参考PHP官方文档关于unset()的如下说明来理解了:

unset()官方文档说明unset()官方文档说明

也就是说,在PHP函数内unset()一个静态变量,实际上销毁的是该函数作用域内的局部变量及其引用,静态内存区域的值仍然存在。

注意:由于PHP官方文档的上述说明不易理解,最近PHP官方的说明文档已经作了如下修改:

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

最新版本的PHP unset()函数说明最新版本的PHP unset()函数说明

0 0
我们认为: 用户的主要目的,是为了获取有用的信息,而不是来点击广告的。因此本站将竭力做好内容,并将广告和内容进行分离,确保所有广告不会影响到用户的正常阅读体验。用户仅凭个人意愿和兴趣爱好点击广告。
我们坚信:只有给用户带来价值,用户才会给我们以回报。
CodePlayer技术交流群1CodePlayer技术交流群1

帮朋友打一个硬广告:

P2P网贷系统(Java版本) 新年低价大促销,多年P2P技术积累,系统功能完善(可按需定制,可支持第三方存管、银行存管),架构稳定灵活、性能优异、二次开发快速简单。 另可提供二次开发、安装部署、售后维护、安全培训等一条龙服务。

外行看热闹,内行看门道。可以自信地认为,在系统设计上,比市面上的晓风、迪蒙、方维、绿麻雀、国融信、金和盛等P2P系统要好。
深圳地区支持自带技术人员现场考察源代码、了解主要技术架构,货比三家,再决定是否购买。

也可推荐他人购买,一旦完全成交,推荐人可获得实际售价 10% 的返现。
有意向者,详情请 点击这里 联系,工作时间立即回复。