码迷,mamicode.com
首页 > 其他好文 > 详细

传值赋值与引用赋值详解

时间:2015-04-12 01:16:50      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:

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 5 起,new 自动返回引用,因此在此使用 =& 已经过时了并且会产生 E_STRICT 级别的消息。
(此段摘自http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/09/10/2173092.html)
 
6. global引用
<?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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!