PHP unset()函数销毁变量
来源:互联网 发布:梅家坞龙井茶知乎 编辑:程序博客网 时间:2024/06/14 04:21
PHP unset()函数是用来销毁变量的,但很多时候,这个函数只把变量给销毁了,内存中存放的该变量的值仍然没有销毁,也就是没能达到我们想要的释放内存的效果。这里我建议大家用 $变量=null 的方法来释放其内存。原因看了下面的就知道了。
以下是关于PHP unset()函数的几点要点:(以下均在windows环境下测试,php 2.5.9)
1. 该函数只有在变量值所占空间超过256字节长的时候才会释放内存
2. 只有当指向该值的所有变量(比如有引用变量指向该值)都被销毁后,地址才会被释放(也要执行1的判断)
下面给出例子代码论证:
- < ?php
- $test=str_repeat("1",256);
- $s = memory_get_usage();
- //改函数用来查看当前所用内存
- unset($test);
- $e = memory_get_usage();
- echo ' 释放内存: '.($s-$e);
- //输出为272,但如果上面test变量改为
$test=str_repeat("1",255),输出则为0- ?>
至于为什么是272而不是256,就不是很清楚了,不知道内部是怎么处理的。
- < ?php
- $test = str_repeat("1",256);
- $p = &$test;
- unset($test);
- echo $p;
- //输出为256个1。如果上面改为unset($p)
,更不行了,echo $test 直接显示为256个1- ?>
也就是说内存中赋给$a的值仍然存在。可见unset()并没达到释放内存的效果。
但如果在上述代码中加入$test=null,或者再加一个unset($p),就能达到释放内存效果了,PHP unset()函数测试代码如下:
变量赋值为null方法:
- < ?php
- $test = str_repeat("1",256);
- $p = &$test;
- $s = memory_get_usage();
- $test = null;
- unset($test);
- $e = memory_get_usage();
- echo ' 释放内存: '.($s-$e);
- //输出为272
- var_dump($p); //输出为NULL
- ?>
将指向该地址中值的变量全部销毁的方法:
- < ?php
- $test = str_repeat("1",256);
- $p = &$test;
- $s = memory_get_usage();
- //注意,以下2个unset()顺序对调没
有关系,不影响结果- unset($p);
- unset($test);
- $e = memory_get_usage();
- echo ' 释放内存: '.($s-$e); //输出为272
- ?>
unset() 用于销毁一个或多个变量。
unset()
PHP unset() 用于销毁一个或多个变量,没有返回值。
语法:
void unset( mixed var [, mixed var [, ...]] )例子:
<?php// 销毁单个变量unset ($var);// 销毁单个数组元素unset ($arr['a']);// 销毁多个变量unset ($var1, $var2, $var3);?>unset() 静态变量
严格讲,使用 unset() 销毁静态变量,只是断开了变量名和变量值之间的引用。
例子:
<?phpfunction foo() { static $b; $a++; $b++; echo "$a---$bn"; unset($a,$b); var_dump($a); var_dump($b); echo "######################n";}foo();foo();foo();?>运行该例子,输出:
1---1NULLNULL#######################1---2NULLNULL#######################1---3NULLNULL#######################unset() 全局变量
同 unset() 静态变量一样,如果在函数中 unset() 一个全局变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用 unset() 之前一样的值。
试着比较如下两个例子:
<?phpfunction destroy_foo() { global $foo; unset($foo);}$foo = 'bar';destroy_foo();echo $foo;?> <?phpfunction destroy_foo() { global $foo; unset($GLOBALS['foo']);}$foo = 'bar';destroy_foo();echo $foo;?>运行第一个例子会输出:bar ,而第二个例子则不会有任何输出。
关于静态变量(static)与全局变量(global)引用更详细的官方参考文档:http://www.php.net/manual/zh/language.variables.scope.php#language.variables.scope.references
提示
- 在很多情况下,可以让 PHP 自动管理变量而无需考虑 unset() 变量。只有在特定的,需要某个变量必须为空的时候才使用到。如:用户退出登录时,为了确保信息的安全性,可以用 unset() 清空 session 的内容。
- PHP unset()函数销毁变量
- PHP unset()函数销毁变量
- 【PHP】用unset销毁变量
- PHP unset销毁变量并释放内存
- php unset销毁变量释放内存注意事项
- PHP unset销毁变量并释放内存
- PHP unset销毁变量并释放内存
- PHP unset销毁变量并释放内存
- PHP unset销毁变量并释放内存
- PHP unset销毁变量并释放内存
- PHP unset销毁变量并释放内存
- php unset销毁变量,释放内存
- unset 销毁变量时释放内存吗
- unset 销毁变量时释放内存吗
- PHP如何释放内存之unset销毁变量并释放内存详解
- php unset函数执行
- php 函数unset
- 变量的操作函数 unset()
- LeetCode--Valid Anagram
- Spring + Jersey构建发布Restful WebService
- SQL报错“参数数据类型 text 对于 replace 函数的参数 1 无效”
- CGBitmapContextCreate函数
- AnnotationSessionFactoryBean和LocalSessionFactoryBean
- PHP unset()函数销毁变量
- jquery动态创建dom节点
- 图片加载问题
- LeetCode--Majority Element
- C++类构造函数初始化列表顺序
- LeetCode(206) Reverse Linked List
- Mysql pid 文件
- spring框架
- 一键安装gitlab7在rehl6.4上