php引用传值实例详解学习


Posted in PHP onNovember 06, 2013

引用是什么
在 PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针,替代的是,引用是符号表别名。注意在 PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身——变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 Unix 文件系统中的 hardlink。
一:变量的引用

<?php
$a =100;
$b = &$a;
echo $b;    //这里输出100
echo $a;    //这里输出100  ,说明$a,和$b的值都是一百。
$b= 200;
echo $a;    //这里输出200
echo $b;    //这里输出200,这就可以看出他们用的是同一个地址。改变一个,另一个也会跟着改变。
?>
 

二:函数中引用传值
<?php
function main($a,$b){
    $b= $a+100;
    return $b;
}
main(55,&$b);      //这里的$b其实就是把它的内存地址传递给函数main中的$b参数,通过参数$b的改变而改变外面的$b的值。
echo $b;  //这里会输出155,
?>

三:对象的引用传值
对象的引用
<?
class club{
var $name="real madrid";
}
$b=new club;
$c=$b;
echo $b->name;//这里输出real madrid
echo $c->name;//这里输出real madrid
$b->name="ronaldo";
echo $c->name;//这里输出ronaldo
?>

取消引用
当你 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。例如:
<?php
$a = 'ronaldo'
$b =&$a;
unset ($a);
?>
 

不会 unset $b,只是 $a。

例,引用传递
test1.php

<?php 
/** 
*   引用传递 
    以下内容可以通过引用传递: 
    变量,例如 foo($a) 
    New 语句,例如 foo(new foobar()) 
    从函数中返回的引用,例如: */
    function foo(&$var) 
    { 
        $var++; 
    } 
    $a=5; 
    //合法 
    foo($a); 
    foo(new stdClass()); 
    //非法使用 
    function bar() // Note the missing & 
    { 
       $a = 5; 
       return $a; 
    } 
    foo(bar()); // 自 PHP 5.0.5 起导致致命错误 
    foo($a = 5) // 表达式,不是变量 
    foo(5) // 导致致命错误 
?>
 

test2.php
<?php 
function test(&$a) 
{ 
$a=$a+100; 
} 
$b=1; 
echo $b;//输出1 
test($b);   //这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值了 echo "<br>"; 
echo $b;//输出101 
/***************************** 
* 
* 这里需要注意 call_user_func_array 后的参数是需要 & 
* 
* ****************************/
    //上面的“ test($b); ” 中的$b前面不要加 & 符号,但是在函数“call_user_func_array”中,若要引用传参,就得需要 & 符号,如下代码所示: 
    function a(&$b){ 
        $b++; 
    } 
    $c=0; 
    call_user_func_array('a',array(&$c)); 
    echo $c; 
//输出 1 
?>
 

引用返回
引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。不要用返回引用来增加性能,引擎足够聪明来自己进行优化。仅在有合理的技术原因时才返回引用!要返回引用,使用此语法
<?php 
function &test() 
{ 
static $b=0;//申明一个静态变量 
$b=$b+1; 
echo $b; 
return $b; 
}     $a=test();//这条语句会输出 $b的值 为1 
    $a=5; 
    $a=test();//这条语句会输出 $b的值 为2 
    $a=&test();//这条语句会输出 $b的值 为3  这里将return $b中的 $b变量的内存地址与$a变量的内存地址 指向了同一个地方 
    $a=5;  //已经改变了 return $b中的 $b变量的值 
    $a=test();//这条语句会输出 $b的值 为6 
?>

解释:
通过这种方式$a=test();得到的其实不是函数的引用返回,这跟普通的函数调用没有区别 至于原因: 这是PHP的规定
php规定通过$a=&test(); 方式得到的才是函数的引用返回
至于什么是引用返回呢(php手册上说:引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。) 这句狗屁话 害我半天没看懂

用上面的例子来解释就是
$a=test()方式调用函数,只是将函数的值赋给$a而已, 而$a做任何改变 都不会影响到函数中的$b
而通过$a=&test()方式调用函数呢, 他的作用是 将return $b中的 $b变量的内存地址与$a变量的内存地址 指向了同一个地方
即产生了相当于这样的效果($a=&$b;) 所以改变$a的值 也同时改变了$b的值 所以在执行了
$a=&test();
$a=5;
以后,$b的值变为了5

这里是为了让大家理解函数的引用返回才使用静态变量的,其实函数的引用返回多用在对象中
在举一个有意思的例子是在oschina上看到的:

<?php 
$a = array('abe','ben','cam'); 
foreach ($a as $k=>&$n) 
    $n = strtoupper($n); 
foreach ($a as $k=>$n) // notice NO reference here! 
    echo "$nn"; 
print_r($a); 
?>
 

will result in:

ABE
BEN
BEN
Array
(
    [0] => ABE
    [1] => BEN
    [2] => BEN
)
解释: 在第二个foreach中循环如下:
Array
(
[0] => ABE
[1] => BEN
[2] => ABE
)
Array
(
[0] => ABE
[1] => BEN
[2] => BEN
)
Array
(
[0] => ABE
[1] => BEN
[2] => BEN
)
因为没有unset($n),所以它始终指向数组的最后一个元素,第二个foreach里第一次循环把$n,也就是$a[2]改成了ABE,第二次循环改成了BEN,第三次就也是BEN了。

PHP 相关文章推荐
php email邮箱正则
Oct 08 PHP
php 图像函数大举例(非原创)
Jun 20 PHP
PHP操作XML作为数据库的类
Dec 19 PHP
深入PHP数据加密详解
Jun 18 PHP
php文件上传的简单实例
Oct 19 PHP
一张表搞清楚php is_null、empty、isset的区别
Jul 07 PHP
PHPCMS V9 添加二级导航的思路详解
Oct 20 PHP
Yii2.0框架实现带分页的多条件搜索功能示例
Feb 20 PHP
不常用但很实用的PHP预定义变量分析
Jun 25 PHP
php输出反斜杠的实例方法
Sep 19 PHP
解决laravel id非自增 模型取回为0 的问题
Oct 11 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
Feb 18 PHP
php二维数组排序详解
Nov 06 #PHP
PHP Curl多线程原理实例详解
Nov 06 #PHP
php二维数组用键名分组相加实例函数
Nov 06 #PHP
php不用正则验证真假身份证
Nov 06 #PHP
php 中文字符串首字母的获取函数分享
Nov 04 #PHP
PHP图片上传代码
Nov 04 #PHP
PHP CURL获取cookies模拟登录的方法
Nov 04 #PHP
You might like
php定界符
2014/06/19 PHP
PHP实现利用MySQL保存session的方法
2014/08/23 PHP
利用“多说”制作留言板、评论系统
2015/07/14 PHP
PHP命名空间和自动加载类
2016/04/03 PHP
php压缩文件夹最新版
2018/07/18 PHP
jquery 常用操作方法
2010/01/28 Javascript
超简单的jquery的AJAX用法
2010/05/10 Javascript
基于OO的动画附加插件,可以实现弹跳、渐隐等动画效果 分享
2013/06/24 Javascript
window.location不跳转的问题解决方法
2014/04/17 Javascript
原生JS实现LOADING效果
2015/03/16 Javascript
jQuery实现根据类型自动显示和隐藏表单
2015/03/18 Javascript
javascript自定义in_array()函数实现方法
2015/08/03 Javascript
解决WordPress使用CDN后博文无法评论的错误
2015/12/15 Javascript
jQuery使用eraser.js插件实现擦除、刮刮卡效果的方法【附eraser.js下载】
2017/04/28 jQuery
jquery append与appendTo方法比较
2017/05/24 jQuery
基于Bootstrap下拉框插件bootstrap-select使用方法详解
2018/08/07 Javascript
脚手架vue-cli工程webpack的作用和特点
2018/09/29 Javascript
Vuejs监听vuex中值的变化的方法示例
2018/12/02 Javascript
浅谈一个webpack构建速度优化误区
2019/06/24 Javascript
vue实现鼠标经过动画
2019/10/16 Javascript
详解Vue3 Teleport 的实践及原理
2020/12/02 Vue.js
[00:32]2018DOTA2亚洲邀请赛EG出场
2018/04/03 DOTA
[01:20:37]FNATIC vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
pyqt4教程之实现windows窗口小示例分享
2014/03/07 Python
python实现requests发送/上传多个文件的示例
2018/06/04 Python
python+opencv实现移动侦测(帧差法)
2020/03/20 Python
python 图像插值 最近邻、双线性、双三次实例
2020/07/05 Python
HTML5引入的新数组TypedArray介绍
2012/12/24 HTML / CSS
酒店管理专业毕业生推荐信
2013/11/10 职场文书
优秀党支部事迹材料
2014/01/14 职场文书
小学毕业寄语大全
2014/04/03 职场文书
文明礼仪演讲稿
2014/05/12 职场文书
2014年高三班主任工作总结
2014/12/05 职场文书
2015年乡镇工作总结范文
2015/04/22 职场文书
中学生打架《检讨书》范文
2019/08/12 职场文书
python开发的自动化运维工具ansible详解
2021/08/07 Python