PHP引用符&的用法详细解析
发布时间:2023-10-17 17:25:53
关于php的引用(就是在变量或者函数、对象等前面加上&符号)的作用,我们先看下面这个程序。
<?php
$a = 100; //声明变量a
$b = &$a; //声明变量b,引用自变量a
echo "$a <br />";
echo "$b <br />";
$a++; //变量a自增1
echo "$a <br />";
echo "$b <br />";//查看变量b,也增加了1,说明使用的是同一存储单元
?>
程序运行结果:
100
100
101
101
很多人误解php中的引用跟C当中的指针一样,事实上并非如此,而且很大差别。C语言中的指针除了在数组传递过程中不用显式申明外,其他都需要使用*进行定义,而php中对于地址的指向(类似指针)功能不是由用户自己来实现的,是由Zend核心实现的,php中引用采用的是“写时拷贝”的原理,就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的。
php默认为传值传递:
<?php
$a = 20;
$b = $a;
$a = $a + 10;
echo $a.' and '.$b;
?>
程序运行结果:
30 and 20
要是想变为地址传递需要加&,既:
<?php
$a = 20;
$b = &$a;
$a = $a + 10;
echo $a.' and '.$b;
?>
程序运行结果:
30 and 30
也就是说,&把$a的地址传给了$b,这样的话这两个变量现在共享一个内存的存储区域,就是说它们的值是一样的。
同样的语法可以用在函数中,它返回引用,以及用在 new 运算符中:
<?php
$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 永远是调用它的对象的引用。


猜你喜欢
- 1 前言前面的文章中我们已经获取到了基金的阶段变动信息和ETF信息的获取,那么在本章中,我们将继续前面的内容,获取基金的价格信息,并且把之前
- 本文实例讲述了PHP实现登录,注册及密码修改功能的方法。分享给大家供大家参考,具体如下:这里介绍注册,登录,修改密码的界面布局与功能实现:1
- MySql explain语句的返回结果中,filtered字段要怎么理解?MySql5.7官方文档中描述如下:The filte
- 本文实例讲述了python实现搜索指定目录下文件及文件内搜索指定关键词的方法。分享给大家供大家参考。具体实现方法如下:#!/usr/bin/
- 本文实例讲述了python实现将元祖转换成数组的方法。分享给大家供大家参考。具体分析如下:python的元祖使用一对小括号表示的,元素是固定
- csv的简单介绍CSV (Comma Separated Values),即逗号分隔值(也称字符分隔值,因为分隔符可以不是逗号),是一种常用
- 这篇文章主要介绍了python多进程并发demo实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 1 安装Djangopython -m pip install django2 新建项目 my_apidjango-admin startp
- 梯度下降(Gradient Descent)算法是机器学习中使用非常广泛的优化算法。当前流行的机器学习库或者深度学习库都会包括梯度下降算法的
- 主键自增MySQL 提供了主键自增机制 AUTO_INCREMENT. 对主键使用, 保证了主键的唯一性.注意:自增长必须与主键字段配合使用
- 本文为大家分享了SQL Server使用row_number分页的实现方法,供大家参考,具体内容如下1、首先是select ROW_NUMB
- 本段代码是先将需要转换经纬度的地址爬取在 ‘地址.csv' 文件里,文件截图示例:代码展示# coding=utf-8# SPL#
- 很早之前就在PJ的blog上看到可以用VS2005调试ASP程序,但是没有写出具体的步骤,后来一次偶尔也让我找到了方法,但是一直没把它写出来
- 一、 背景介绍web应用采用的是ssh框架,数据库使用的sql server2014版本。二、问题:客户要求,ID列的数据类型必须是uniq
- 摘要在上一篇文章,时间日期处理的入门里面,我们简单介绍了一下载pandas里对时间日期的简单操作。下面将补充一些常用方法。时间日期的比较假设
- 项目实现利用face++开发一个课堂签到的软件,实现面向摄像头即可完成记录学号、姓名和时间的签到工作。项目架构项目使用场景代码:流程代码,主
- 一、动机(Motivate)在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂
- 1. 在linux上安装psiblast最好新建一个python环境,因为我发现conda安 * last默认的是python==3.6.11
- 如果有一个多任务多loss的网络,那么在训练时,loss是如何工作的呢?比如下面:model = Model(inputs = input,
- 接管Dingo-api的错误如上图所示,AppServiceProvider.php中的register()方法中添加如下代码\API::e