服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|JavaScript|易语言|

服务器之家 - 编程语言 - PHP教程 - php中引用符号(&)的使用详细介绍

php中引用符号(&)的使用详细介绍

2021-04-02 20:11PHP教程网 PHP教程

php的引用就是在变量或者函数、对象等前面加上&符号,在PHP 中引用的意思是:不同的名字访问同一个变量内容,下面介绍如何使用PHP的引用,需要的朋友可以参考下

与C语言中的指针是有差别的.C语言中的指针里面存储的是变量的内容在内存中存放的地址变量的引用.

PHP 的引用允许你用两个变量来指向同一个内容

php" id="highlighter_459718">
?
1
2
3
4
5
6
7
8
$a="ABC";
$b =&$a;
echo $a;//这里输出:ABC
echo $b;//这里输出:ABC
$b="EFG";
echo $a;//这里$a的值变为EFG 所以输出EFG
echo $b;//这里输出EFG

函数的传址调用

传址调用我就不多说了 下面直接给出代码

?
1
2
3
4
5
6
7
8
9
10
11
<?php
function test(&$a) {
  $a = $a + 100;
}
$b = 1;
echo $b; //输出1
test($b); //这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值了
echo "<br>";
echo $b; //输出101
 
?> 

 要注意的是,在这里test(1);的话就会出错,原因自己去想

函数的引用返回

先看代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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
$a = 5;
$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

这里是为了让大家理解函数的引用返回才使用静态变量的,其实函数的引用返回多用在对象中

对象的引用

 

?
1
2
3
4
5
6
7
8
9
10
11
12
<?php
class a {
  var $abc = "ABC";
}
$b = new a;
$c = $b;
echo $b->abc; //这里输出ABC
echo $c->abc; //这里输出ABC
$b->abc = "DEF";
echo $c->abc; //这里输出DEF
 
?>                   

以上代码是在PHP5中的运行效果

在PHP5中 对象的复制 是通过引用来实现的。上列中$b=new a; $c=$b; 其实等效于$b=new a; $c=&$b;
PHP5中默认就是通过引用来调用对象, 但有时你可能想建立一个对象的副本,并希望原来的对象的改变不影响到副本 . 为了这样的目的,PHP定义了一个特殊的方法,称为__clone.

引用的作用

如果程序比较大,引用同一个对象的变量比较多,并且希望用完该对象后手工清除它,个人建议用 "&" 方式,然后用$var=null的方式清除. 其它时候还是用php5的默认方式吧. 另外, php5中对于大数组的传递,建议用 "&" 方式, 毕竟节省内存空间使用。

取消引用

当你 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。例如:

?
1
2
3
4
$a = 1;
$b =& $a;
unset ($a);

不会 unset $b,只是 $a。

global 引用

当用 global $var 声明一个变量时实际上建立了一个到全局变量的引用。也就是说和这样做是相同的:

?
1
$var =& $GLOBALS["var"];

这意味着,例如,unset $var 不会 unset 全局变量。

$this

在一个对象的方法中,$this 永远是调用它的对象的引用。

//下面再来个小插曲

php中对于地址的指向(类似指针)功能不是由用户自己来实现的,是由Zend核心实现的,php中引用采用的是“写时拷贝”的原理,就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的。

通俗的讲

1:如果有下面的代码

?
1
2
$a="ABC";
$b=$a;

 其实此时 $a与$b都是指向同一内存地址 而并不是$a与$b占用不同的内存 2:如果在上面的代码基础上再加上如下代码

?
1
$a="EFG";

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

延伸 · 阅读

精彩推荐
  • PHP教程php 高性能书写

    php 高性能书写

    从这里就可以看到,第二段代码会因应数组中的键的个数去不停地作出判断次数为1+2+3的判断,所以变成了第一段代码判断次数是3,而第二段代码判断次数...

    php教程网1742019-11-13
  • PHP教程关于php程序报date()警告的处理(date_default_timezone_set)

    关于php程序报date()警告的处理(date_default_timezone_set)

    PHP Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function ...

    PHP教程网5432020-05-22
  • PHP教程php创建基本身份认证站点的方法详解

    php创建基本身份认证站点的方法详解

    本篇文章是对php创建基本身份认证站点进行了详细的分析介绍,需要的朋友参考下 ...

    PHP教程网4322020-04-08
  • PHP教程php验证码的制作思路和实现方法

    php验证码的制作思路和实现方法

    这篇文章主要介绍了php验证码的制作思路和实现方法,我们不能盲目的去实现php生成验证码,更应该了解php验证码的基本原理,真正的掌握php验证码的实现...

    PHP教程网1902020-12-01
  • PHP教程PHPUnit PHP测试框架安装方法

    PHPUnit PHP测试框架安装方法

    PHPUnit是一个轻量级的PHP测试框架。它是在PHP5下面对JUnit3系列版本的完整移植,是xUnit测试框架家族的一员(它们都基于模式先锋Kent Beck的设计)。 ...

    PHP教程网1602019-11-19
  • PHP教程Zend Framework教程之Application用法实例详解

    Zend Framework教程之Application用法实例详解

    这篇文章主要介绍了Zend Framework教程之Application用法,详细分析了Zend_Application的功能,定义,参数含义及相关使用技巧,需要的朋友可以参考下...

    coder5262020-12-28
  • PHP教程WordPress网站性能优化指南

    WordPress网站性能优化指南

    很多博主都会感觉WordPress很慢?作为全世界最常用的建站和博客系统WordPress来说,在性能设计上肯定不会有太大的问题,WordPress开发团队也肯定也考虑到这...

    PHP教程网5082020-12-02
  • PHP教程深入php socket的讲解与实例分析

    深入php socket的讲解与实例分析

    本篇文章是对php中socket的讲解与实例进行了详细的分析介绍,需要的朋友参考下 ...

    PHP教程网2132020-04-13