`

php 引用传递、引用返回和取消引用以及unset

    博客分类:
  • php
阅读更多

原文出处:http://hi.baidu.com/kashifs/blog/item/928379f254888cbea50f524a.html

 

在 PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针,替代的是引用是符号表别名。注意在 PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。

 

 

引用传递

function foo ( &$var )
{$var++;}
foo ($a);  // 注意在函数调用时没有引用符号 - 只有函数定义中有。光是函数定义就足够使参数通过引用来正确传递了
 

引用返回

function &init_users()
{ ... return $cls;}
//使用引用返回,必须在两个地方都用&符号
$user = & init_users();
function &init_users()
{ ...return $cls;}
 

取消引用
当 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。

$a="hihaha";
$b= &$a;
unset($b);
echo$a;// shows "hihaha"
 


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

这里有个php引用的例子,好好看一遍:

<?php
//if you do:

$a="hihaha";
$b= &$a;
$c="eita";
$b=$c;
echo$a;// shows "eita"

$a="hihaha";
$b= &$a;
$c="eita";
$b= &$c;
echo$a;// shows "hihaha"

$a="hihaha";
$b= &$a;
$b=null;
echo$a;// shows nothing (both are set to null)

$a="hihaha";
$b= &$a;
unset($b);
echo$a;// shows "hihaha"

$a="hihaha";
$b= &$a;
$c="eita";
$a=$c;
echo$b;// shows "eita"

$a="hihaha";
$b= &$a;
$c="eita";
$a= &$c;
echo$b;// shows "hihaha"

$a="hihaha";
$b= &$a;
$a=null;
echo$b;// shows nothing (both are set to null)

$a="hihaha";
$b= &$a;
unset($a);
echo$b;// shows "hihaha"
?>
 
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

PHP unset全局变量在用户函数中只能销毁局部变量,并不能销毁全局变量。(从PHP4开始unset已经不再是一个函数了,而是一个语句)。如果需要销毁全局变量的应该如何做呢?也很简单,用$GLOBALS数组来实现。

< ?PHP 
function foo() { 
unset($GLOBALS['bar']);  // 而不是unset($bar)
} 
$bar = “something”; 
foo(); 
var_dump($bar); 
?>
 

对于unset:

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

也就是检查有无其他变量绑定,有的话就不会释放了。就像这个例子:

$a="hihaha";
$b= &$a;
unset($b);
echo$a;// shows "hihaha"
 

所以建议大家用 $变量=null 的方法来释放其内存。

 给一个测试当前php脚本内存使用情况的函数:

<?php
echo memory_get_usage()."\n";
$a = str_repeat("A", 1000);
echo memory_get_usage()."\n";
$b=&$a;  //下面的内存大小不会变,unset只是解除$a的绑定
unset($a);
echo memory_get_usage()."\n";
?>
 

自己理解的仍然不行,看这里:http://www.laruence.com/2011/03/04/1894.html

分享到:
评论

相关推荐

    关于php的unset

    关于php的unset的一些研究和示例,分享给大家,共同进步吧

    PHP中isset()和unset()函数的用法小结

    如果已经使用 unset() 释放了一个变量之后,它将不再是 isset()。若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。同时要注意的是一个 NULL 字节(”\0″)并不等同于 PHP 的 NULL 常数。 警告: isset...

    PHP unset()函数用来释放内存

    NULL 博文链接:https://onestopweb.iteye.com/blog/2359426

    PHP unset函数原理及使用方法解析

    unset—释放给定的变量 说明 unset(mixed$var[,mixed$…] ) :void unset()销毁指定的变量。 unset()在函数中的行为会依赖于想要销毁的变量的类型而有所不同。 如果在函数中unset()一个全局变量,则只是局部变量被...

    关于php unset对json_encode的影响详解

    PHP 中有个释放变量的语句叫做unset(从PHP4开始unset已经不再是一个函数了,而是一个语句),本文主要给大家介绍了关于php unset对json_encode影响的相关内容,下面话不多说了,来一起看看详细的介绍吧 先运行一段...

    PHP中删除变量时unset()和null的区别分析

    第一种方法:$varname=null 第二种方法:unset($varname) 这两种方法都可以删除变量,但结果有些许的差别。 代码: 复制代码 代码如下: &lt;?php $a = array( ‘a’ =&gt; ‘a’, ‘b’ =&gt; ‘b’ ); $b = array( ‘a’ ...

    php中用unset销毁变量并释放内存

    PHP的unset()函数用来清除、销毁变量,不用的变量,我们可以用unset()将它销毁。但是某些时候,用unset()却无法达到销毁变量占用的内存! 我们先看一个例子: &lt;?php $s = str_repeat('1',255); //产生由255个1...

    PHP中使用unset销毁变量并内存释放问题

    PHP的unset()函数用来清除、销毁变量,不用的变量,我们可以用unset()将它销毁。但是某些时候,用unset()却无法达到销毁变量占用的内存!

    解析PHP中的unset究竟会不会释放内存

    PHP中的unset究竟会不会释放内存?以下我们实例说明一下

    php使用unset()删除数组中某个单元(键)的方法

    主要介绍了php使用unset()删除数组中某个单元(键)的方法,实例分析了unset函数在删除数组单元时的使用技巧,需要的朋友可以参考下

    unset-value:使用点表示法从对象中删除嵌套属性

    请考虑关注该项目的作者 ,并考虑为该项目以显示您的 :red_heart: 和支持。 安装 使用安装: $ npm install --save unset-value 用法 var unset = require ( 'unset-value' ) ; unset ( obj , prop ) ; 参量 obj {...

    php unset全局变量运用问题的深入解析

    PHP unset全局变量在实际使用中只能销毁局部变量,并不能实现全局变量的目的。下面我们就来具体解决这一问题。希望对大家有所帮助。PHP中语言中有些函数对于初学者来说在字面上是很难理解的,需要在实际编码中总结...

    unset命令 删除指定的shell变量或函数

    unset命令用于删除已定义的shell变量(包括环境变量)和shell函数。unset命令不能够删除具有只读属性的shell变量和环境变量。 语法格式:unset[参数] 常用参数: -f 仅删除函数 -v 仅删除变量 参考...

    php中is_null,empty,isset,unset 的区别详细介绍

    is_null, empty, isset, unset 我们先来看看这4个函数的描述。 isset 判断变量是否已存在(配置)unset 把变量删除(释放)掉empty 判断变量是否为空is_null 判断变量是否为NULLok,已经开始搞人了。那么开始,这4个...

    PHP中unset,array_splice删除数组中元素的区别

    如果要在某个数组中删除一个元素,可以直接用的unset,但是数组的索引不会重排: &lt;?php $arr = array('a','b','c','d'); unset($arr[1]); print_r($arr); ?&gt; 结果是: Array ( [0] =&gt; a [2] =&gt; c [3] =&gt; d ...

    Linux unset命令用法详解

    Linux unset命令 Linux unset命令用于删除变量或函数。 unset为shell内建指令,可删除变量或函数。 语法 unset [-fv][变量或函数名称] 参数: -f 仅删除函数。 -v 仅删除变量。 实例 删除环境变量 [root@runoob....

    PHP对象相互引用的内存溢出实例分析

    通常来说使用脚本语言最大的好处之一就是可利用其拥有的自动垃圾...如果两个对象之间存在着相互引用的关系,如“父对象-子对象”,对父对象调用 unset()不会释放在子对象中引用父对象的内存(即便父对象被垃圾回收,也

    基于session_unset与session_destroy的区别详解

    session_unset()释放当前在内存中已经创建的所有$_SESSION变量,但不删除session文件以及不释放对应的sessionidsession_destroy()删除当前用户对应的session文件以及释放sessionid,内存中的$_SESSION变量内容依然...

Global site tag (gtag.js) - Google Analytics