`

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中关于引用(&)详解.docx

    #### 函数的引用返回 在PHP中,可以通过引用的方式返回一个函数的结果。当一个函数使用`&`符号作为其返回值的一部分时,表示这个函数返回的是一个引用。 **示例代码**: ```php &lt;?php function &test() { static...

    一步一步学习PHP(3) php 函数

    本文将逐步介绍PHP函数的基础知识,包括函数的声明、参数的值传递与引用传递以及作用域问题。 1. **函数声明** PHP函数使用`function`关键字进行声明。例如: ```php function CustomPrint($str) { for ($i = 0...

    php中引用符号(&)的使用详细介绍

    3. **函数的引用返回** PHP函数可以返回引用,而不是值的拷贝。例如: ```php function &test() { static $b = 0; $b = $b + 1; echo $b; return $b; } $a = test(); // 输出1,但并未获得引用 $a = 5; $...

    浅谈PHP变量作用域以及地址引用问题

    4. **取消引用**:通过`unset`函数可以取消变量的引用绑定,但是它并不销毁变量的内容。被取消引用的变量一旦再次被访问,将会提示一个警告,表明未定义变量。 ### 引用的深层次原理 PHP中的引用采用的是“写拷贝...

    php引用传值实例详解学习

    5. **取消引用**: - 使用 `unset()` 函数解除引用,并不会销毁变量内容,只是断开了变量名与内容之间的关联。`unset($a)` 并不会影响 `$b` 的值。 6. **引用传递的注意事项**: - 在函数调用时,如果需要引用...

    php中引用符号(&amp;)的使用详解

    - **取消引用**:`unset()`只解除引用,不销毁变量内容。例如,`unset($a)`不会影响`$b`。 - **全局引用**:`global`关键字创建的是全局变量的引用,`unset($var)`不会影响全局变量。 - **`$this`引用**:在对象方法...

    php 引用(&amp;)详解

    使用`unset`函数可以取消引用,但请注意,这并不会销毁变量内容本身。 ```php $a = 1; $b = &$a; unset($a); // 断开$a与$b之间的引用关系,但$b仍然存在 ``` #### 六、全局引用 当在函数内部使用`global`关键字...

    技术部门应聘测验题PHP.pdf

    当unset($test)时,只取消了$test的引用,但$abc仍然存在,因此输出结果为空字符串。 2. 文件操作函数:在PHP中,用于打开文件读写的是`fopen()`函数,而不是`fget()`、`file_open()`或`open_file()`。 3. 静态...

    PHP基础语法试题(二)答案版.pdf

    PHP函数支持可变参数个数、通过引用传递参数以及递归调用。但是,PHP函数不支持通过指针传递参数。 7. **数组操作**: 要获取数组的大小或元素数量,可以使用`count()`函数,例如`count($array)`。 8. **代码...

    PHP的面试题集收集整理.doc

    1. `unset()`取消引用,但不会改变原始变量,所以`$a`仍是"hello"。 2. 自增操作符`++`优先级高于赋值,所以`$b`会是1,因为`$a`先自增再赋值给`$b`。 3. `empty()`检查变量是否为空,空数组视为假,因此`$x`是`true...

    phP基础知识期末考试题(20210108155506)_五年级上册期末考试题

    - **详细解析**:PHP函数支持多种参数传递方式,包括可变数量的参数、通过引用传递参数以及实现递归函数。但是,PHP不支持通过指针传递参数。 #### 20. 文件框的`type`属性值 - **选项分析**: - **A**: 错误。`...

    php单词汇总

    - `&` 符号用于传递变量的引用,而非复制其值。 4. **条件判断** - `===` 和 `!==`: 等价于和不等价于,同时检查值和类型。 - `@` 符号可以抑制错误提示。 - 三元运算符 `? :` 用于简单条件判断,例如 `$result...

    PHP类中的魔术方法(Magic Method)简明总结

    它接收两个参数:调用的方法名和传递给该方法的参数数组。当尝试调用一个对象上不存在的方法时,`__call()` 将被触发,从而允许你自定义错误处理或动态调用其他方法。 - `__callStatic()` 类似于 `__call()`,但它...

Global site tag (gtag.js) - Google Analytics