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实现mysql同步的实现方法
Oct 21 PHP
PHP spl_autoload_register实现自动加载研究
Dec 06 PHP
PHP框架Swoole定时器Timer特性分析
Aug 19 PHP
thinkphp模板继承实例简述
Nov 26 PHP
PHP跨平台获取服务器IP地址自定义函数分享
Dec 29 PHP
php模拟post提交数据的方法
Feb 12 PHP
php使用标签替换的方式生成静态页面
May 21 PHP
Yii2前后台分离及migrate使用(七)
May 04 PHP
PHP中的use关键字及文件的加载详解
Nov 28 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
PHP实现微信退款的方法示例
Mar 26 PHP
php随机生成验证码,php随机生成数字,php随机生成数字加字母!
Apr 01 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
关于手调机和数调机的选择
2021/03/02 无线电
php为什么选mysql作为数据库? Mysql 创建用户方法
2007/07/02 PHP
php array_search() 函数使用
2010/04/13 PHP
PHP采用超长(超大)数字运算防止数字以科学计数法显示的方法
2016/04/01 PHP
PHP获取文本框、密码域、按钮的值实例代码
2017/04/19 PHP
laravel model模型处理之修改查询或修改字段时的类型格式案例
2019/10/17 PHP
javascript dom 基本操作小结
2010/04/11 Javascript
浅谈Javascript嵌套函数及闭包
2010/11/09 Javascript
javascript数字格式化通用类 accounting.js使用
2012/08/24 Javascript
解决ExtJS在chrome或火狐中正常显示在ie中不显示的浏览器兼容问题
2013/01/11 Javascript
JS获取时间的方法
2015/01/21 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
2015/04/30 Javascript
JS模拟键盘打字效果的方法
2015/08/05 Javascript
有关JavaScript中call()和apply() 的一些理解
2016/05/20 Javascript
js 中文汉字转Unicode、Unicode转中文汉字、ASCII转换Unicode、Unicode转换ASCII、中文转换
2016/12/06 Javascript
js for循环倒序输出数组元素的实例
2017/03/01 Javascript
Js实现中国公民身份证号码有效性验证实例代码
2017/05/03 Javascript
Vue高版本中一些新特性的使用详解
2018/09/25 Javascript
基于vue-cli搭建多模块且各模块独立打包的项目
2019/06/12 Javascript
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:EE凭借法力虚空拿下4杀
2017/03/30 DOTA
使用Python编写简单网络爬虫抓取视频下载资源
2014/11/04 Python
python中子类继承父类的__init__方法实例
2016/12/15 Python
python操作mysql数据库
2017/03/05 Python
python实现对求解最长回文子串的动态规划算法
2018/06/02 Python
Python中按键来获取指定的值
2019/03/02 Python
NumPy统计函数的实现方法
2020/01/21 Python
python的Jenkins接口调用方式
2020/05/12 Python
使用python tkinter开发一个爬取B站直播弹幕工具的实现代码
2021/02/07 Python
公司捐款倡议书
2014/05/14 职场文书
学校志愿者活动总结
2014/06/27 职场文书
2014年党支部工作总结
2014/11/13 职场文书
2014年维修电工工作总结
2014/11/20 职场文书
关于召开会议的通知
2015/04/15 职场文书
惊涛骇浪观后感
2015/06/05 职场文书
跟班学习心得体会(共6篇)
2016/01/23 职场文书
新手开公司创业注意事项有哪些?
2019/07/29 职场文书