PHP unset()函数销毁变量

2024-04-10 16:58
文章标签 函数 php 变量 unset 销毁

本文主要是介绍PHP unset()函数销毁变量,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

PHP unset()函数是用来销毁变量的,但很多时候,这个函数只把变量给销毁了,内存中存放的该变量的值仍然没有销毁,也就是没能达到我们想要的释放内存的效果。这里我建议大家用 $变量=null 的方法来释放其内存。原因看了下面的就知道了。

以下是关于PHP unset()函数的几点要点:(以下均在windows环境下测试,php 2.5.9)

1. 该函数只有在变量值所占空间超过256字节长的时候才会释放内存
2. 只有当指向该值的所有变量(比如有引用变量指向该值)都被销毁后,地址才会被释放(也要执行1的判断)

下面给出例子代码论证:

 
  1. < ?php  
  2. $test=str_repeat("1",256);  
  3. $s = memory_get_usage();   
  4. //改函数用来查看当前所用内存  
  5. unset($test);  
  6. $e = memory_get_usage();  
  7. echo ' 释放内存: '.($s-$e);   
  8. //输出为272,但如果上面test变量改为
    $
    test=str_repeat("1",255),输出则为0  
  9. ?> 

至于为什么是272而不是256,就不是很清楚了,不知道内部是怎么处理的。

 
  1. < ?php  
  2. $test = str_repeat("1",256);  
  3. $p = &$test;  
  4. unset($test);  
  5. echo $p;   
  6. //输出为256个1。如果上面改为unset($p)
    ,更不行了,echo $test 直接显示为256个1  
  7. ?> 

也就是说内存中赋给$a的值仍然存在。可见unset()并没达到释放内存的效果。

但如果在上述代码中加入$test=null,或者再加一个unset($p),就能达到释放内存效果了,PHP unset()函数测试代码如下:

变量赋值为null方法:

 
  1. < ?php  
  2. $test = str_repeat("1",256);  
  3. $p = &$test;  
  4. $s = memory_get_usage();   
  5. $test = null;  
  6. unset($test);  
  7. $e = memory_get_usage();  
  8. echo ' 释放内存: '.($s-$e); 
  9. //输出为272  
  10. var_dump($p); //输出为NULL  
  11. ?> 

将指向该地址中值的变量全部销毁的方法:

 
  1. < ?php  
  2. $test = str_repeat("1",256);  
  3. $p = &$test;  
  4. $s = memory_get_usage();   
  5. //注意,以下2个unset()顺序对调没
    有关系,不影响结果  
  6. unset($p);  
  7. unset($test);   
  8. $e = memory_get_usage();  
  9. echo ' 释放内存: '.($s-$e); //输出为272  
  10. ?> 

unset() 用于销毁一个或多个变量。

unset()

PHP unset() 用于销毁一个或多个变量,没有返回值

语法:

void unset( mixed var [, mixed var [, ...]] )

例子:

<?php
// 销毁单个变量
unset ($var);// 销毁单个数组元素
unset ($arr['a']);// 销毁多个变量
unset ($var1, $var2, $var3);
?>

unset() 静态变量

严格讲,使用 unset() 销毁静态变量,只是断开了变量名和变量值之间的引用。

例子:

<?php
function foo() {static $b;$a++;$b++;echo "$a---$bn";unset($a,$b);var_dump($a);var_dump($b);echo "######################n";
}foo();
foo();
foo();
?>

运行该例子,输出:

1---1
NULL
NULL
#######################
1---2
NULL
NULL
#######################
1---3
NULL
NULL
#######################

unset() 全局变量

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

试着比较如下两个例子:

<?php
function destroy_foo() {global $foo;unset($foo);
}$foo = 'bar';
destroy_foo();
echo $foo;
?> <?php
function 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()函数销毁变量的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/891632

相关文章

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

kotlin的函数forEach示例详解

《kotlin的函数forEach示例详解》在Kotlin中,forEach是一个高阶函数,用于遍历集合中的每个元素并对其执行指定的操作,它的核心特点是简洁、函数式,适用于需要遍历集合且无需返回值的场... 目录一、基本用法1️⃣ 遍历集合2️⃣ 遍历数组3️⃣ 遍历 Map二、与 for 循环的区别三、高

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

MySQL中COALESCE函数示例详解

《MySQL中COALESCE函数示例详解》COALESCE是一个功能强大且常用的SQL函数,主要用来处理NULL值和实现灵活的值选择策略,能够使查询逻辑更清晰、简洁,:本文主要介绍MySQL中C... 目录语法示例1. 替换 NULL 值2. 用于字段默认值3. 多列优先级4. 结合聚合函数注意事项总结C

Java8需要知道的4个函数式接口简单教程

《Java8需要知道的4个函数式接口简单教程》:本文主要介绍Java8中引入的函数式接口,包括Consumer、Supplier、Predicate和Function,以及它们的用法和特点,文中... 目录什么是函数是接口?Consumer接口定义核心特点注意事项常见用法1.基本用法2.结合andThen链

MySQL 日期时间格式化函数 DATE_FORMAT() 的使用示例详解

《MySQL日期时间格式化函数DATE_FORMAT()的使用示例详解》`DATE_FORMAT()`是MySQL中用于格式化日期时间的函数,本文详细介绍了其语法、格式化字符串的含义以及常见日期... 目录一、DATE_FORMAT()语法二、格式化字符串详解三、常见日期时间格式组合四、业务场景五、总结一、

golang panic 函数用法示例详解

《golangpanic函数用法示例详解》在Go语言中,panic用于触发不可恢复的错误,终止函数执行并逐层向上触发defer,最终若未被recover捕获,程序会崩溃,recover用于在def... 目录1. panic 的作用2. 基本用法3. recover 的使用规则4. 错误处理建议5. 常见错

Java中对象的创建和销毁过程详析

《Java中对象的创建和销毁过程详析》:本文主要介绍Java中对象的创建和销毁过程,对象的创建过程包括类加载检查、内存分配、初始化零值内存、设置对象头和执行init方法,对象的销毁过程由垃圾回收机... 目录前言对象的创建过程1. 类加载检查2China编程. 分配内存3. 初始化零值4. 设置对象头5. 执行