• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    深入理解php中unset()

    概述

    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;$i5;$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;$i5;$i++){
    	fun1();
    	echo "br/>";
    }

    output: 

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

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

    您可能感兴趣的文章:
    • PHP unset函数原理及使用方法解析
    • php中用unset销毁变量并释放内存
    • 关于php unset对json_encode的影响详解
    • php使用unset()删除数组中某个单元(键)的方法
    • PHP魔术方法__ISSET、__UNSET使用实例
    • PHP中isset()和unset()函数的用法小结
    • 解析PHP中的unset究竟会不会释放内存
    • php unset全局变量运用问题的深入解析
    • php中is_null,empty,isset,unset 的区别详细介绍
    • PHP中使用unset销毁变量并内存释放问题
    • php中session_unset与session_destroy的区别分析
    • PHP中删除变量时unset()和null的区别分析
    上一篇:PHP使用三种方法实现数据采集
    下一篇:php一句话木马变形技巧
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    深入理解php中unset() 深入,理解,php,中,unset,深入,