标签:
1. 基础概念
1 <?php
2 $a = ‘a‘;
3 $b = ‘b‘;
4 echo "$a,$b<hr />";
5 // 显示a,b
6 $b = $a; // 传值赋值
7 $a = ‘a1‘;
8 echo "$a,$b<hr />";
9 // 显示a1,a
10 $b =& $a; // 引用赋值
11 $a = ‘a2‘;
12 echo "$a,$b<hr />";
13 // 显示a2,a2
14 ?>
2. unset()对引用赋值变量的影响以及应用
1 <?php
2 $a = ‘1‘;
3 $b =& $a;
4 echo "$a,$b<hr />";
5 // 显示1,1
6 unset($a);
7 echo "$a,$b<hr />";
8 // $a被销毁,但是由于$b依旧占用‘1’这个参数,$b可调用。
9 ?>
如果程序比较大,引用同一个对象的变量比较多,并且希望用完该对象后手工清除它,用 "&" 方式,然后用$var=null的方式清除。
3. 函数中的引用赋值
1 <?php
2 function num(&$num) // 引用赋值
3 {
4 $num++;
5 return $num;
6 }
7 $a = 1;
8 echo $a.‘,‘;
9 echo num($a).‘,‘;
10 echo $a;
11 // 显示1,2,2
12 ?>
此种函数,无法使用num(1),参数必须为变量。
4. 函数的引用返回
<?php
function &test()
{
static $b = 0;//申明一个静态变量
$b += 1;
echo $b.‘,‘;
return $b;
}
$a = test();//这条语句会输出 $b的值 为1
$a = 5;
$a = test();//这条语句会输出 $b的值 为2
$a =& test();//这条语句会输出 $b的值 为3
$a = 5;
$a = test();//这条语句会输出 $b的值 为6
?>
$a = test()方式调用函数,只是将函数的值赋给$a而已,而$a做任何改变 都不会影响到函数中的$b.
而通过$a = &test()方式调用函数,作用是将return $b中的$b变量的内存地址与$a变量的内存地址指向了同一个地方。
即产生了相当于这样的效果($a=&$b;) 所以改变$a的值,也同时改变了$b的。
5. 对象的引用
<?php
class a{
var $abc = "ABC";
}
$b = new a;
$c = $b;
echo $b->abc;//这里输出ABC
echo $c->abc;//这里输出ABC
$b->abc = "DEF";
echo $c->abc;//这里输出DEF
?>
在PHP5中 对象的赋值是个引用的过程。上列中$b=new a; $c=$b; 其实等效于$b=new a; $c=&$b;
PHP5中默认就是通过引用来调用对象, 但有时你可能想建立一个对象的副本,并希望原来的对象的改变不影响到副本 . 为了这样的目的,PHP5定义了一个特殊的方法,称为__clone。
<?php
$a =& $GLOBALS["a"];
?>
当用 global $a 声明一个变量时实际上建立了一个到全局变量的引用。unset($a) 不会 unset 全局变量。
7. 大数组中处理的好处
一个很大的数组$a,如果使用$b = $a;,那么内存使用将多一倍,如果用$b =& $a;,那么几乎没有啥影响,且速度快于前者。
<?php
$arr = array(
‘0‘ => array(
‘0‘ => array()
),
‘1‘ => array()
);
// 第一种方法
$arr[0][0] = 1;
// 第二种方法
$b =& $arr[0];
$b[0] = 1;
?>
标签:
原文地址:http://www.cnblogs.com/hysteriahank/p/4418841.html