unset()经常会被用到,用于销毁指定的变量,但它有自己的行为模式,如果不仔细的话可能会被中文解释给迷惑:

先来看看官方文档的说法:

unset  —— unset a given variable

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


parameters:

var:The variable to be unset.    //要unset的变量

...:Another variable ... //其他需要unset的变量


return Values:No value is returned.    //unset不返回值



Because this is a language construct and not a function,it cannot be called using variable functions.

//unset()是语言结构,不是函数,因此不能被函数变量调用,具体参照函数变量。

使用function_exists('unset')返回的false,以此证明unset并不是一个函数,所以无法使用$fun='unset';$fun()的方式调用unset()


It is possible to unset even object properties visible in current context.

//通用环境下unset可以销毁对象或者对象的可见属性(public)


It is not possible to unset $this inside an object method since PHP5

在php5之前unset无法销毁对象中的$this方法


when using unset() on inaccessible  object properties,the __unset() overloading method will be called,if declare.

当unset()无法销毁对象中的属性,例如私有属性,保护属性,那么会自动加载对象中的__unset方法。

description:

unset() destroys the specified variables.     //unset()销毁指定的变量

The behavior of unset() inside of a function can vary dependiing on what type of variable you are attempting to destroy.

//unset()的行为在函数内部可以根据你所指定销毁的变量类型变化。


情况一:

if a globalized variable is unset() inside of a function,only the local variable is destroyed.The variable in the calling environment will retain the same value as before unset() was called.

如果在函数内一个使用global使其全局化的变量,使用unset进行销毁,那么只有局部的变量会被销毁,在调用环境的变量将会保留没有使用unset()销毁之前的调用的变量值。

the example:

<?php
function destroy_foo()
{global $foo;unset($foo);
}$foo = 'bar';
destroy_foo();
echo $foo;
?>

the above example will output:bar

这是官方文档的例子,可能这样还是不太明显,把上面的例子改成下面这样,一切就很清晰了。

<?php
function des(){global $foo;$foo='bars';unset($foo);echo $foo;
}
$foo='bar';
echo "The globalized variable is unset() inside of a function:";
des();
echo "<br/>";
echo "The variable in the calling environment:";
echo $foo;

上面的例子会返回如下结果:

可以看到函数内echo $foo会得到错误提示该变量没有定义,因为unset将$foo在函数内的局部变量销毁了。

而外部调用环境的$foo仍保留着没有被unset进行销毁,上面官方描述上写了调用环境的$foo将保留的是在使用unset()前的变量值,因此echo出bars,而不是bar。

to unset() a global variable inside of a function,then use the $GLOBALS array to do so.

如果要用unset()销毁函数中的全局变量,应该使用$GLOBALS数组形式

function destroy_foo(){unset($GLOBALS['foo']);
}
$foo = 'bar';
destroy_foo();
echo $foo;

the above example whill output:  Notice : Undefined variable: foo in ...

延伸:

这里可以明确一点,函数内global修饰的变量$var会使其全局化,但和$GLOBALS['var']性质不同,虽然他们都是使用的外部调用环境的$var,但是函数内global $var里保存的只是外部环境调用变量$val的一个指针或者同名引用,而$GLOBALS['var']是外部调用环境$var本身,因此unset在函数内对两者进行销毁会产生上面例子的不同的原因,前者销毁的只是保存同名引用或者指针的变量$var,后者销毁的是外部调用变量$var本身。


情况二:

if a variable  that is PASSED BY REFERENCE is unset() inside of a function,only the local variable is destroyed.The variable in the calling environment will retain the same value as before unset() was called.

如果一个被引用的函数在函数内部使用unset()进行销毁,那么只有函数内部的局部变量被销毁,而调用环境变量仍然会保留unset()之前被调用的值。

<?php
function foo(&$bar){unset($bar);$bar="blah";
}
$bar='something';
echo $bar."\n";
foo($bar);
echo $bar."\n";

The above example will output:something something

这个和上面global其实很相似,函数内部引用的变量$bar其实保存的是外部环境变量$bar的指针或者说外部变量$bar的引用,因此unset在函数内部销毁的并不是外部环境调用的变量,因此外部环境调用的变量$bar还存在。


情况三:
if a static variable is unset() inside of a function,unset() destroys the variable only in the context of the rest of a function.Following calls will restore the previous value of a variable.
如果是函数内部的静态变量使用unset(),unset()销毁掉函数内部的静态变量,但是下次调用会恢复之前该静态变量的值。
为了更明显,下面的例子进行对比,这里对官方的范例进行了修改对比:
<?php
function fun1(){static $count=0;$count++;echo "before:".$count." ";$count='2';echo "after".$count." ";
}for($i=0;$i<5;$i++){fun1();echo "<br/>";
}

output:

下面使用unset:
<?php
function fun1(){static $count=0;$count++;echo "before:".$count." ";unset($count);$count='2';echo "after".$count." ";
}for($i=0;$i<5;$i++){fun1();echo "<br/>";
}

output:

两个对比可以看出,unset只是将函数内部的静态变量进行了销毁,但没有销毁储存在内存里的该静态变量的值,因为在函数内部用static声明的静态变量存储的仅仅是指向内存存储该静态变量的一个指针,因此unset()销毁的时候也仅仅是销毁了该指针,但存储在内存里的静态变量值没有受到影响,因此再次调用该函数的时候,static该变量再次建立了与内存中该变量的指针关系,而上一次调用时unset()之前的该变量值依旧存在,因此会恢复该变量上一次的值,因此$count进行了递增。
后续再补充unset对象...

php unset()详解相关推荐

  1. php unset 多可以什么_PHP unset() 详解

    我们对unset() 这个函数的作用的了解大概就是它可以销毁一个变量,释放内存,这种理解并没有错,可能就是不够深入,接下来我通过几个例子向大家展示下unset一个变量后真正发生的一些事情.以下的代码是 ...

  2. Samtools(CentOS Linux)安装及常用命令详解

    序列比对(将测序reads与已知序列信息的基因或基因组进行比对)是高通量测序数据分析中最重要的一环,无论是转录组还是重测序都是基于比对结果来进行后续各项分析的,比对结果格式比较常见的是sam和bam文 ...

  3. varnish配置详解

       varnish配置详解 能用到缓存的服务器的原因是,应用到了程序的局部性. 空间局部性:一个程序最近访问了一个空间,那么他周边的空间也将被访问. 时间的局部性:一条指令一段时间内被执行,之后的一 ...

  4. foreach php,详解PHP中foreach的用法和实例

    本篇文章介绍了详解PHP中foreach的用法和实例,详细介绍了foreach的用法,感兴趣的小伙伴们可以参考一下. 在PHP中经常会用到foreach的使用,而要用到foreach,就必须用到数组. ...

  5. Linux-shell-完全详解

    Linux-shell-完全详解(1) 一. Shell简介:什么是Shell,Shell命令的两种执行方式1 二. 几种常见的Shell1 三. Shell脚本语言与编译型语言的差异2 四.什么时候 ...

  6. mapper命名规范_Mybatis系列全解(五):全网最全!详解Mybatis的Mapper映射文件

    封面:洛小汐 作者:潘潘 若不是生活所迫,谁愿意背负一身才华. 前言 上节我们介绍了 < Mybatis系列全解(四):全网最全!Mybatis配置文件 XML 全貌详解 >,内容很详细( ...

  7. linux应用程序开发数据,《嵌入式linux应用程序开发详解》核心笔记

    [linux快速入门] 自由软件(free software)中的 free 并不是指免费,而是指自由.它赋予使用者四种自由. · 自由之一:有使用软件的自由. · 自由之二:有研究该软件如何运作的自 ...

  8. linux下/etc目录详解

    Linux /etc目录详解 /etc目录  包含很多文件.许多网络配置文件也在/etc 中.  /etc/rc   or/etc/rc.d   or/etc/rc*.d    启动.或改变运行级时运 ...

  9. php 文件扫描去重,PHP中的去重方法详解和文件下载

    本文主要和大家分享PHP中的去重方法详解和文件下载,在php中文件导入过程中,经常会遇到重复事件,那么就需要我们去重,然后进行下载. 1.思想 先设置一个存储主键数组,和一个空数组.解析文件,然后看要 ...

最新文章

  1. ROADS POJ - 1724(最短路+邻接表+dfs)
  2. c语言二叉树构造与输出,C语言数据结构树状输出二叉树,谁能给详细的解释一下...
  3. spring整合ehcache2.5.2缓存异常-- net.sf.ehcache.CacheException
  4. stm32基本定时器
  5. django2与ajax,Python-Django-Ajax进阶2
  6. 快手与美团达成互联互通合作:美团将在快手上线小程序
  7. Vmware安装CentOS7后访问不了外网
  8. JDBC批处理插入更新MySQL Oracle
  9. php zend studio 下载地址,Zend Studio
  10. ML/DL学习笔记2——偏差和方差模型好坏
  11. 时钟指针角度。【问题描述】普通时钟都有时针和分针。在任意时刻,时针和分针都有一个夹角,并且假设时针和分针都是连续移动的。现已知当前的时刻,试求出在该时刻时针和分针的夹角A(0≤A≤180)。
  12. 积极为开发者提供开源客服系统,春松客服得到有味生活3D商城认可
  13. 使用IMS搭建LMS系统(Logistics Management System 物流管理信息系统)
  14. 公众号开发素材管理效果演示-微信开发素材管理1
  15. 【Leetcode】1905. Count Sub Islands
  16. 苹果手机使用爱思助手安装ipa软件
  17. 学校网站服务器配置要求,学校校园网站服务器安全配置建议.docx
  18. 标普500指数下跌2.4%至盘中低点
  19. SketchUp:SketchUp草图大师软件界面介绍之详细攻略
  20. Zynq UltraScale+ MPSoC EV系列VCU应用通路搭建

热门文章

  1. 景观手绘剖面商业空间设计作品集合
  2. 很久没写了,发个策划书如何?
  3. android intent分享第二次,Android利用Intent.ACTION_SEND进行分享
  4. PCB设计当中<过孔>的设计规范
  5. 6-2 综合成绩排名-结构体二 (100分)
  6. MATLAB能正常运行但任务栏图标显示白色问题的一种解决方法
  7. 机器学习模型监控的 9 个技巧
  8. 【新手教程】阿里云视频点播,轻轻松松给网站加上视频的翅膀
  9. How browsers work 浏览器是如何工作的
  10. ssm网络课程平台的设计与搭建