关于php的引用(就是在变量或者函数、对象等前面加上&符号)的作用,我们先看下面这个程序。

代码如下:

$a = 100; //声明变量a

$b = &$a; //声明变量b,引用自变量a

echo "$a
";

echo "$b
";

$a++; //变量a自增1

echo "$a
";

echo "$b
";//查看变量b,也增加了1,说明使用的是同一存储单元

?>

程序运行结果:

100

100

101

101

很多人误解php中的引用跟C当中的指针一样,事实上并非如此,而且很大差别。C语言中的指针除了在数组传递过程中不用显式申明外,其他都需要使用*进行定义,而php中对于地址的指向(类似指针)功能不是由用户自己来实现的,是由Zend核心实现的,php中引用采用的是“写时拷贝”的原理,就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的。

php默认为传值传递:

代码如下:

$a = 20;

$b = $a;

$a = $a + 10;

echo $a.' and '.$b;

?>

程序运行结果:

代码如下:

30 and 20

要是想变为地址传递需要加&,既:

代码如下:

$a = 20;

$b = &$a;

$a = $a + 10;

echo $a.' and '.$b;

?>

程序运行结果:

代码如下:

30 and 30

也就是说,&把$a的地址传给了$b,这样的话这两个变量现在共享一个内存的存储区域,就是说它们的值是一样的。

同样的语法可以用在函数中,它返回引用,以及用在 new 运算符中:

代码如下:

$bar =& new fooclass();

$foo =& find_var($bar);

?>

引用做的第二件事是用引用传递变量。这是通过在函数内建立一个本地变量,并且该变量在呼叫范围内引用了同一个内容来实现的。说的通俗点就是一个函数的参数是一个本地变量的引用。下面再举例说明一下:

代码如下:<?php

function foo(&$val1, $val2) {

$val1 += 1;

$val2 += 1;

}

$a=5;

$b=10;

foo($a,$b);

echo $a;

echo $b;

?>

运行这段代码是给函数传递两个参数,一个是引用$a的内容,一个是$b的值,在执行此函数后,发现$a的内容改变了,而$b的内容则没有变化。

PHP引用的第三个用法是引用返回,这个用法理解起来有点难度,引用返回用在当你想用函数找到引用应该被绑定在哪一个变量上面时。当返回引用时,使用此语法:说的简单点,就还是引用函数的返回。但和参数传递不同,必须在函数定义和函数引用这两个地方都用 & 符号。下面举个例子:

代码如下:<?php

function &find_var ($param)

{

/* ...code... */

return $found_var;

}

$foo =& find_var ($bar);

$foo->x = 2;

?>

这个例子给$foo 赋值是函数find_var的返回引用,所以在给$foo->x赋值时就是给find_var的返回引用赋值,而不是简单的赋值。

PHP引用的最后一个用法是引用定位,主要有两个应用:一个是global 引用,当用 global $var 声明一个变量时实际上建立了一个到全局变量的引用。也就是和$var =& $GLOBALS["var"];是一样的。另外一个是$this的用法,在一个对象的方法中,$this 永远是调用它的对象的引用。

php 地址传递,PHP引用符传递存储地址相关推荐

  1. Java值传递以及引用的传递、数组的传递

    2019独角兽企业重金招聘Python工程师标准>>> 许多编程语言都有2种方法将参数传递给方法------按值传递和按引用传递. 与其他语言不同,Java不允许程序员选择按值传递还 ...

  2. Java的值传递和引用值传递的区别

    值传递针对的对象主要包括:基本数据类型以及其对应的封装类,还有引用类型中特殊的String类型: 值传递的时候,将实参的副本传递给形参,所以无论调用的这个方法里面如何对形参进行改变,都不会影响实参的值 ...

  3. php值传递和java_Java的值传递和引用传递

    形参与实参 我们先来重温一组语法: 形参:方法被调用时需要传递进来的参数,如:func(int a)中的a,它只有在func被调用期间a才有意义,也就是会被分配内存空间,在方法func执行完成后,a就 ...

  4. 这一次,彻底解决Java的值传递和引用传递

    本文旨在用最通俗的语言讲述最枯燥的基本知识 学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨 ...

  5. Java值传递和引用传递详细说明(详细分析)

    1. 形参与实参 我们先来重温一组语法: 形参:方法被调用时需要传递进来的参数,如:func(int a)中的a,它只有在func被调用期间a才有意义,也就是会被分配内存空间,在方法func执行完成后 ...

  6. Java值传递和引用传递详细说明

    本文旨在用最通俗的语言讲述最枯燥的基本知识 学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨 ...

  7. 一文彻底搞懂Java中的值传递和引用传递!

    关于Java中方法间的参数传递到底是怎样的.为什么很多人说Java只有值传递等问题,一直困惑着很多人,甚至我在面试的时候问过很多有丰富经验的开发者,他们也很难解释的很清楚. 我很久也写过一篇文章,我当 ...

  8. 对几种传递的理解:值传递,地址传递,引用传递

    对几种传递的理解:值传递,地址传递,引用传递 因为会用到形参和实参的概念,区别一下,形参 即在定义函数时 int add(int a , int b)中a,b,即为形参.而当调用时int(3,4)中3 ...

  9. java形参和实参的三种传递方式(值传递,地址传递,引用传递)

    博客 博客 值传递:对形参的修改不会影响到实参 引用传递:对形参的修改会影响实参 一.值传递 在主函数中 #include <iostream> using namespace std;v ...

最新文章

  1. Ubuntu16.04下安装sogou输入法
  2. MySQL笔记12:C语言访问MYSQL数据库的完整的代码例子
  3. 内核打上yaffs2补丁遇到的问题
  4. 为什么阿里巴巴禁止开发人员使用isSuccess作为变量名(修订版)
  5. [云炬创业基础笔记]第一章创业环境测试11
  6. 0320互联网新闻 | 网易《明日之后》全球营收突破1.25亿美元;阿里AI labs宣布投入1亿元进行方言保护...
  7. ES6的字符串与正则表达式
  8. E:K-periodic Garland(DP)
  9. 开发人员应该用好的一些网站
  10. python程序代码图片_完整的图片去噪代码(python)
  11. 准备写个Spring Boot教程
  12. ASP.NET MVC 1.0 + spring.net 1.2.0.20288 + NHibernate 2.0.1.4000整合笔记(四)——整合asp.net mvc...
  13. ​使用 QuickBI 搭建酷炫可视化分析
  14. xenserver 虚拟机扩容lvm磁盘分区的方法_vm虚拟机中linux Centos7.4硬盘扩容
  15. bjui刷新当前页签
  16. DS1302时钟模块使用讲解附带完整程序
  17. 熵权法求权重的Matlab实现
  18. 破解无线路由 backtrack BT5 Linux R3 安装 SpoonWep2.deb
  19. Pr---文字过多时显示不全和背景音乐过度处理(简单记录)
  20. 脱壳入门(一)之分析Aspack壳

热门文章

  1. Java File类boolean createNewFile()方法(带示例)
  2. 两个链表求交集_实现两个排序链表的并集和交集
  3. linux oracle删除恢复数据恢复,Linux下Oracle误删除数据文件恢复操作
  4. lvs负载均衡—ldirectord(DR模式的健康检查)
  5. Mybatis中SQL注入攻击的3种方式,真是防不胜防!
  6. 如何设计不宕机的 Redis 高可用服务?
  7. java数组怎么倒循环_java – 用于数组倒计时的反向循环
  8. IDEA查看源码时总是出现.class而不是.java源码(解决办法)
  9. android跑分和ios,手机:苹果VS安卓 跑分不代表手机流畅度
  10. mysql select in 不存在返回0_MySQL索引优化看这篇文章就够了!