php 引用传递、引用返回和取消引用以及unset
PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针,替代的是引用是符号表别名。注意在 PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。
引用传递
Php代码- 1.function foo ( &$var )
- 2.{$var++;}
- 3.foo ($a); // 注意在函数调用时没有引用符号 - 只有函数定义中有。光是函数定义就足够使参数通过引用来正确传递了
- function foo ( &$var )
- {$var++;}
- foo ($a);
复制代码 // 注意在函数调用时没有引用符号 - 只有函数定义中有。光是函数定义就足够使参数通过引用来正确传递了
引用返回
Php代码- 1.function &init_users()
- 2.{ ... return $cls;}
- 3.//使用引用返回,必须在两个地方都用&符号
- 4.$user = & init_users();
- 5.function &init_users()
- 6.{ ...return $cls;}
- function &init_users()
- { ... return $cls;}
- //使用引用返回,必须在两个地方都用&符号
- $user = & init_users();
- function &init_users()
- { ...return $cls;}
复制代码 取消引用
当 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。
Php代码- 1.$a="hihaha";
- 2.$b= &$a;
- 3.unset($b);
- 4.echo$a;// shows "hihaha"
- $a="hihaha";
- $b= &$a;
- unset($b);
- echo$a;// shows "hihaha"
复制代码 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
这里有个php引用的例子,好好看一遍:
Php代码- 1.<?php
- 2.//if you do:
- 3.
- 4.$a="hihaha";
- 5.$b= &$a;
- 6.$c="eita";
- 7.$b=$c;
- 8.echo$a;// shows "eita"
- 9.
- 10.$a="hihaha";
- 11.$b= &$a;
- 12.$c="eita";
- 13.$b= &$c;
- 14.echo$a;// shows "hihaha"
- 15.
- 16.$a="hihaha";
- 17.$b= &$a;
- 18.$b=null;
- 19.echo$a;// shows nothing (both are set to null)
- 20.
- 21.$a="hihaha";
- 22.$b= &$a;
- 23.unset($b);
- 24.echo$a;// shows "hihaha"
- 25.
- 26.$a="hihaha";
- 27.$b= &$a;
- 28.$c="eita";
- 29.$a=$c;
- 30.echo$b;// shows "eita"
- 31.
- 32.$a="hihaha";
- 33.$b= &$a;
- 34.$c="eita";
- 35.$a= &$c;
- 36.echo$b;// shows "hihaha"
- 37.
- 38.$a="hihaha";
- 39.$b= &$a;
- 40.$a=null;
- 41.echo$b;// shows nothing (both are set to null)
- 42.
- 43.$a="hihaha";
- 44.$b= &$a;
- 45.unset($a);
- 46.echo$b;// shows "hihaha"
- 47.?>
- <?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代码- 1.< ?PHP
- 2.function foo() {
- 3.unset($GLOBALS['bar']); // 而不是unset($bar)
- 4.}
- 5.$bar = “something”;
- 6.foo();
- 7.var_dump($bar);
- 8.?>
- < ?PHP
- function foo() {
- unset($GLOBALS['bar']); // 而不是unset($bar)
- }
- $bar = “something”;
- foo();
- var_dump($bar);
- ?>
复制代码 对于unset:
1. 该函数只有在变量值所占空间超过256字节长的时候才会释放内存
2. 只有当指向该值的所有变量(比如有引用变量指向该值)都被销毁后,地址才会被释放(也要执行1的判断)
也就是检查有无其他变量绑定,有的话就不会释放了。就像这个例子:
Php代码- 1.$a="hihaha";
- 2.$b= &$a;
- 3.unset($b);
- 4.echo$a;// shows "hihaha"
- $a="hihaha";
- $b= &$a;
- unset($b);
复制代码 echo$a;// shows "hihaha"
所以建议大家用 $变量=null 的方法来释放其内存。
给一个测试当前php脚本内存使用情况的函数:
Php代码- 1.<?php
- 2.echo memory_get_usage()."\n";
- 3.$a = str_repeat("A", 1000);
- 4.echo memory_get_usage()."\n";
- 5.$b=&$a; //下面的内存大小不会变,unset只是解除$a的绑定
- 6.unset($a);
- 7.echo memory_get_usage()."\n";
- 8.?>
复制代码 |