入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

php unset()详解

创建时间:2016-12-11 投稿人: 浏览次数:248

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

The above example will output:something something

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


声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。