深入理解php中unset()

admin3年前PHP教程27
概述

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:

<?phpfunction 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."";foo($bar);echo $bar."";

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进行了递增。

以上就是深入理解php中unset()的详细内容,更多关于php unset()的资料请关注其它相关文章!

免责声明:本文内容来自用户上传并发布,站点仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。请核实广告和内容真实性,谨慎使用。

相关文章

海外多ip服务器被恶意攻击了怎么办

海外多ip服务器被恶意攻击的解决方法:1、对网站攻击进行评估,根据具体的攻击进行具体的防御;2、建立镜像网站,将网站的客户引到镜像网站中去;3、建立预防DDoS策略,并定期对服务器进行查毒杀毒,能降低...

租用韩国多IP服务器的好处

韩国拥有先进的科技产业和良好的网络基础设施,因此很多企业和个人都需要租用韩国多IP服务器来搭建网站、进行游戏、进行数据分析等等。首先,需要了解的是韩国多IP服务器是指在一个韩国物理服务器上分配多个IP...

GPU服务器的使用案例香港gpu服务器租用费用

GPU服务器的使用案例?1、深度学习的应用案例深度学习模仿的是我们人类大脑运行的方式——从经验中学习,它的最终目标是让机器能够像人一样具有分析学习能力,能够识别文字、图像和声音等数据。深度学习的实际案...

GPU服务器的使用场景?江西GPU服务器租用地址是多少?

服务器具备很强的现实意义,我们每天都在无形中跟服务器打交道。针对用途不同,服务器可分为诸多类型。为增加大家对服务器的了解程度,本文将对GPU服务器予以介绍。通过本文,您将对GPU服务器有所认识。GPU...

显卡服务器一般是用来做什么香港显卡服务器适合哪些行业购买

服务器是计算机的一种,它比普通计算机运行更快、负载更高、价格更贵。服务器在网络中为其它客户机(如PC机、智能手机、ATM等终端甚至是火车系统等大型设备)提供计算或者应用服务。服务器具有高速的CPU运算...

PHP实现两种排课方式

两种排课方式:固定每周的固定时间上课总共上几个周,每周上课时间比较个性化第一种排课比较好实现,简要代码如下:/**     * 生成日期列表 ...