通过5个php实例细致说明传值与传引用的区别


Posted in PHP onAugust 08, 2012

哈哈,会用只是初级阶段,要了解原理是什么,这样才能更好去运用,费话不多说
传值:是把实参的值赋值给行参 ,那么对行参的修改,不会影响实参的值
传引用 :真正的以地址的方式传递参数传递以后,行参和实参都是同一个对象,只是他们名字不同而已对行参的修改将影响实参的值
说明:
传值:根copy是一样的。打个比方,我有一?H房子,我给你建筑材料,你建了一个根我的房子一模一样的房子,你在你的房子做什么事都不会影响到我,我在我的房子里做什么事也不会影响到你,彼此独立。
传引用:让我想起了上大学时学习C语言的指针了,感觉差不多。打个比方,我有一?H房子,我给你一把钥匙,我们二个都可以进入这个房子,你在房子做什么都会影响到我。
一,php实例
1,传值

<?php 
$param1=1; //定义变量1 
$param2=2; //定义变量2 
$param2 = $param1; //变量1赋值给变量2 
echo $param2; //显示为1 
?>

2,传引用
<?php 
$param2=1; //定义变量2 
$param1 = &$param2; //将变量2的引用传给变量1 
echo $param2; //显示为1 
$param1 = 2; //把2赋值给变量1 
echo $param2; //显示为2 
?>

3,函数传值
<?php 
//传值 
$param1 = 1; //定义变量1 
function add($param2) //传参数 
{ 
$param2=3; //把3赋值给变量2 
} 
$param3=add($param1); //调用方法add,并将变量1传给变量2 
echo '<br>$param1=='.$param1.'<br>'; //显示为$param1==1 
echo '<br>$param2=='.$param2.'<br>'; //显示为$param2== 因为$param2是局部变量,所以不能影响全局 
echo '<br>$param3=='.$param3.'<br>'; //显示为$param3== 因为add方法没有返回值,所以$param3为空 
?>

4,函数传引用
<?php 
//传值 
$param1 = 1; //定义变量1 
function add(&$param2) //传参数 
{ 
$param2=3; //把3赋值给变量2 
// return $param2; //返回变量2 
} 
echo '<br>$param1=='.$param1.'<br>'; //显示为$param1==1 没对变量1进行操作 
$param3=add($param1); //调用方法add,并将变量1的引用传给变量2 
echo '<br>$param1=='.$param1.'<br>'; //显示为$param1==3 调用变量过程中,$param2的改变影响变量1,虽然没有return 
echo '<br>$param2=='.$param2.'<br>'; //显示为$param2== 因为$param2局部变量,所以不能影响全局 
echo '<br>$param3=='.$param3.'<br>'; //显示为$param3== 如果把方法里面的return注释去掉的话就为$param3==3 
?>

5,函数传引用2
<?php 
//传引用 
$param1 = 1; 
function &add(&$param2) 
{ 
$param2 = 2; 
return $param2; 
} 
$param3=&add($param1); 
$param4=add($param1); 
echo '<br>$param3=='.$param3.'<br>'; //显示为$param3==2 
echo '<br>$param4=='.$param4.'<br>'; //显示为$param4==2 
echo '<br>$param1=='.$param1.'<br>'; //显示为$param1==2 调用变量过程中,$param2的改变影响变量1 
$param3++; 
/*下面显示为$param1==3,这是因为$param2和$param1引用到同一个地方, 
* 返回值前面加了地址符号还是一个引用$param3=&add($param1); 
* 这样$param3,$param2和$param1引用到同一个地方,当$param3++;时, 
* $param1会被改变*/ 
echo '<br>$param1=='.$param1.'<br>'; 
$param4++; 
/* 下面显示为$param1==3,这里为什么是3而不是4呢,这是因为返回值前面没有 
* 地址符号,它不是一个引用所以当$param4改变时不会影响$param1*/ 
echo '<br>$param1=='.$param1.'<br>'; 
?>

哈哈,不过我觉得传引用会好一点,耗的资源少。上面测试没有明显的差距,可能是因为测试数据不够大造成的,如果有更大数据来测试,我想会有明显的不同。
PHP 相关文章推荐
PHP 增加了对 .ZIP 文件的读取功能
Oct 09 PHP
如何使用Linux的Crontab定时执行PHP脚本的方法
Dec 19 PHP
PHP设计模式之迭代器模式的深入解析
Jun 13 PHP
浅析php插件 Simple HTML DOM 用DOM方式处理HTML
Jul 01 PHP
使用php测试硬盘写入速度示例
Jan 27 PHP
php switch语句多个值匹配同一代码块应用示例
Jul 29 PHP
PHP实现采集中国天气网未来7天天气
Oct 15 PHP
php实现有趣的人品测试程序实例
Jun 08 PHP
PHP+Mysql+jQuery实现发布微博程序 php篇
Oct 15 PHP
PHP缓冲区用法总结
Feb 14 PHP
php并发加锁示例
Oct 17 PHP
如何让PHP编码更加好看利于阅读
May 12 PHP
php调用方法mssql_fetch_row、mssql_fetch_array、mssql_fetch_assoc和mssql_fetch_objcect读取数据的区别
Aug 08 #PHP
php中++i 与 i++ 的区别
Aug 08 #PHP
php中判断文件空目录是否有读写权限的函数代码
Aug 07 #PHP
PHP中全局变量global和$GLOBALS[]的区别分析
Aug 06 #PHP
php一个找二层目录的小东东
Aug 02 #PHP
PHP文章采集URL补全函数(FormatUrl)
Aug 02 #PHP
PHP服务器页面间跳转实现方法
Aug 02 #PHP
You might like
PHP程序员常见的40个陋习,你中了几个?
2014/11/20 PHP
PHP面向对象程序设计之接口的继承定义与用法详解
2018/12/20 PHP
Yii框架日志操作图文与实例详解
2019/09/09 PHP
php+redis实现消息队列功能示例
2019/09/19 PHP
jQuery Validation插件remote验证方式的Bug解决
2010/07/01 Javascript
异步动态加载JS并运行(示例代码)
2013/12/13 Javascript
js捕获鼠标滚轮事件代码
2013/12/16 Javascript
JS辨别访问浏览器判断是android还是ios系统
2014/08/19 Javascript
使用jQuery管理选择结果
2015/01/20 Javascript
javascript实现英文首字母大写
2015/04/23 Javascript
javascript函数命名的三种方式及区别介绍
2016/03/22 Javascript
Js获取图片原始宽高的实现代码
2016/05/17 Javascript
jQuery扩展+xml实现表单验证功能的方法
2016/12/25 Javascript
详解微信小程序 相对定位和绝对定位
2017/05/11 Javascript
详解Angular 4.x NgTemplateOutlet
2017/05/24 Javascript
VUE写一个简单的表格实例
2019/08/06 Javascript
jQuery zTree插件使用简单教程
2019/08/16 jQuery
vue中使用element ui的弹窗与echarts之间的问题详解
2019/10/25 Javascript
python操作xml文件详细介绍
2014/06/09 Python
在Python中使用成员运算符的示例
2015/05/13 Python
浅析Python的web.py框架中url的设定方法
2016/07/11 Python
Python入门_浅谈for循环、while循环
2017/05/16 Python
python实现多层感知器MLP(基于双月数据集)
2019/01/18 Python
Pandas之groupby( )用法笔记小结
2019/07/23 Python
Anaconda+VSCode配置tensorflow开发环境的教程详解
2020/03/30 Python
python实现文件+参数发送request的实例代码
2021/01/05 Python
CSS3实现10种Loading效果
2016/07/11 HTML / CSS
请解释接口的显式实现有什么意义
2012/05/26 面试题
linux下进程间通信的方式
2013/01/23 面试题
自主招生自荐信格式
2013/12/03 职场文书
秋季运动会稿件
2014/01/30 职场文书
优秀班组长事迹
2014/05/31 职场文书
机械制造专业大学生自我鉴定
2014/09/19 职场文书
升职感谢信
2015/01/22 职场文书
MySQL中VARCHAR与CHAR格式数据的区别
2021/05/26 MySQL
Java数组与堆栈相关知识总结
2021/06/29 Java/Android