传值和传引用的区别在于,如果一个参数比较大,占用大量的内存空间,那么传引用的话就会节省拷贝空间。

传值:是把实参的值赋值给行参 ,那么对行参的修改,不会影响实参的值

传引用 :真正的以地址的方式传递参数传递以后,行参和实参都是同一个对象,只是他们名字不同而已对行参的修改将影响实参的值

说明:

1. 传值:根copy是一样的。打个比方,我有一橦房子,我给你建筑材料,你建了一个根我的房子一模一样的房子,你在你的房子做什么事都不会影响到我,我在我的房子里做什么事也不会影响到你,彼此独立。

2. 传引用:让我想起了上大学时学习C语言的指针了,感觉差不多。打个比方,我有一橦房子,我给你一把钥匙,我们二个都可以进入这个房子,你在房子做什么都会影响到我。

例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.函数传引用

 <?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传值与传址(引用)的更多相关文章

  1. javascript的变量,传值和传址,参数之间关系

    先把收获晾一下: 1.javascrip变量包含两种类型的值,一种为引用类型的值,一种是基本类型的值.引用类型包括:Array,Object,Function(可以这么理解,非基本类型的都是引用类型) ...

  2. Python的传值和传址与copy和deepcopy

    1.传值和传址 传值就是传入一个参数的值,传址就是传入一个参数的地址,也就是内存的地址(相当于指针).他们的区别是如果函数里面对传入的参数重新赋值,函数外的全局变量是否相应改变,用传值传入的参数是不会 ...

  3. 图解JS的传值与传址

    //编程过程中经常会碰到传值,传址的问题!今天的主题就是关于传值.与传址. //先讲讲赋值操作 //下例是原始类型赋值操作 var a=1,b=a,a=2; console.log("a=& ...

  4. JAVA传值与传址

    要了解JAVA中的传值与传址问题,必要先要了解JVA中的栈内存和堆内存,>>>>点些查看<<<<昨天写的学习记录 栈:基本数据类型.数据的引用变量,这两 ...

  5. java方法中,传参是传值还是传址问题(对比C语言、C#和C++)

    问题引出: 编写一个简单的交换值的小程序,如果我们只是简单地定义一个交换函数接收两个数,在函数内部定义一个中间变量完成交换.那么当我们把a,b两个实参传给这个函数时,往往得不到预期的结果.这是为什么呢 ...

  6. Python 传值和传址 copy/deepcopy

    传值:被调函数局部变量改变不会影响主调函数局部变量 传址:被调函数局部变量改变会影响主调函数局部变量 Python参数传递方式:传递对象引用(传值和传址的混合方式),如果是数字,字符串,元组则传值:如 ...

  7. js- 引用和复制(传值和传址)

    js- 引用和复制(传值和传址) 好像一般很少人讲到js中的引用和复制,不过弄清楚这个概念可以帮助理解很多东西 先讲一下很基础的东西,看看js中几种数据类型分别传的什么引用:对象.数组.函数复制:数字 ...

  8. Java方法传递参数传值还是传址的问题

    这几天重构项目代码遇到一个疑问:可不可以在方法A中定义一个boolean变量b为false,然后A调用方法C把b传递到C方法中经过一些列业务判断后修改为true,C执行结束后A方法中b的值还是原来的f ...

  9. C++中的传值与传址

    在指针的传递中,也涉及到传值与传址的问题.下面通过一个函数进行说明. 代码如下: bool openBinary(uchar* buffer) { ; buffer = (uchar*)malloc( ...

  10. Java传值和传址

    调用函数时,传的参数过去可能是传值,也可能是传址.如果是传值,函数内部的操作对参数的值没有影响:如果是传址,函数内部的操作是对参数指向的内存进行操作,会影响参数的值. Java到底是传值还是传址?用下 ...

随机推荐

  1. 哈希小demo hashCode取模

    package demo; import java.util.ArrayList; import java.util.List; class Person { private String usern ...

  2. 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(1)

    chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...

  3. Android_深入解析AsyncTask

    转载:特别感谢浪人的星空,有部分修改! http://blog.csdn.net/hitlion2008/article/details/7983449 1.AsyncTask的内幕 AsyncTas ...

  4. VisualStudio:如何监控 ADO.NET?

    背景 很多场景下我们都需要监控 ADO.NET,如:查看某些框架(ORM)生成的 SQL.如何在不能使用 SQL Profile 的情况下监控 SQL 呢?VS 为我们提供了一个工具,本文做一些介绍! ...

  5. SharePoint Set-SPUser 命令拒绝访问

    · 前言 最近碰到一个问题,由于User Profile Service服务有问题,用户信息无法更新.所以,想到Set-SPUser命令可以更新,于是乎找到这个命令,但是更新的时候发现拒绝访问的错误. ...

  6. libcurl下载文件

    一.初始化 CURL *pHandler = curl_easy_init();   二.设置请求参数: 调用curl_easy_setopt方法,设置选项 curl_easy_setopt(pHan ...

  7. Material Designer的低版本兼容实现(八)—— Flat Button

       除了中规中矩的矩形按钮外,5.0中将按钮扁平化,产生了一个扁平按钮——Flat Button.这个按钮降低了很多存在感,主要用于在对话框,提示栏中.让整个界面减少层级.今天说的就是它的用法. 这 ...

  8. android BitmapDrawable的使用

    <span style="font-size:18px;"> //功能:显示缩略图,大小为40*40 //通过openRawResource获取一个inputStrea ...

  9. [Android Security] 静态分析Android程序——smali文件解析

    cp : https://blog.csdn.net/hp910315/article/details/51823236 cp : http://www.jb51.net/softjc/119036. ...

  10. anaconda、pip配置国内镜像

    一.anaconda配置镜像查看源:conda config --show-sources在Mac and Linux下:conda config --add channels https://mir ...