引用是什么

在 PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针:例如你不能对他们做指针运算,他们并不是实际的内存地址。替代的是,引用是符号表别名。注意在PHP 中,变量名和变量内容是不一样的, 因此同样的内容可以有不同的名字。

引用做什么

PHP 的引用允许用两个变量来指向同一个内容。意思是,当这样做时:

 <?php

 $a = &$b;

 ?>

这意味着 $a 和 $b 指向了同一个变量,并不是$a指向$b或者相反。

如果对一个未定义的变量进行引用赋值、引用参数传递或引用返回,则会自动创建该变量。

 <?php
function foo(&$var) { } foo($a); // $a被创建,并赋值为null $b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // $b['b']被创建 返回 bool(true) $c = new StdClass;
foo($c->d);
var_dump(property_exists($c, 'd')); // 在$c中创建d属性 返回 bool(true) ?>

如果在 foreach语句中给一个具有引用的变量赋值,被引用的对象也被改变。

 <?php
$ref = 0;
$row =& $ref;
foreach (array(1, 2, 3) as $row) {
// 执行操作
}
echo $ref; // 3 - 迭代数组的最后一个元素
?>
 

引用做的第二件事是用引用传递变量。这是通过在函数内建立一个本地变量并且该变量在呼叫范围内引用了同一个内容来实现的。

 <?php
function foo(&$var)
{
$var++;
} $a=5;
foo($a);
?>

$a 变成 6。这是因为在 foo 函数中变量 $var 指向了和 $a 指向的同一个内容。

引用做的第三件事是引用返回。

引用传递

注意在函数调用时没有引用符号——只有函数定义中有。光是函数定义就足够使参数通过引用来正确传递了。

以下内容可以通过引用传递:

  • 变量,例如 foo($a)
  • New 语句,例如 foo(new foobar())
  • 从函数中返回的引用,例如:

 <?php
function &bar()
{
$a = 5;
return $a;
}
foo(bar());
?>

任何其它表达式都不能通过引用传递,结果未定义。

引用返回

引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。不要用返回引用来增加性能,引擎足够聪明来自己进行优化。仅在有合理的技术原因时才返回引用!要返回引用,使用此语法:

 <?php
class foo {
public $value = 42; public function &getValue() {
return $this->value;
}
} $obj = new foo;
$myValue = &$obj->getValue(); // $myValue 是对$obj->value 的引用,该值为 42.
$obj->value = 2;
echo $myValue; // 打印 $obj->value 赋值,即 2.
?>

取消引用

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

 <?php
$a = 1;
$b =& $a;
unset($a);
?>

不会unset $b,只是$a.

引用定位

许多 PHP 的语法结构是通过引用机制实现的,所以上述有关引用绑定的一切也都适用于这些结构。一些结构,例如引用传递和返回,已经在上面提到了。其它使用引用的结构有:

global 引用

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

 <?php
$var =& $GLOBALS["var"];
?>

unset $var 不会 unset 全局变量。

$this

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

以上知识点整理于php.net

PHP引用(&)的更多相关文章

  1. 【.net 深呼吸】序列化中的“引用保留”

    假设 K 类中有两个属性/字段的类型相同,并且它们引用的是同一个对象实例,在序列化的默认处理中,会为每个引用单独生成数据. 看看下面两个类. [DataContract] public class 帅 ...

  2. CSS 选择器及各样式引用方式

    Css :层叠样式表 (Cascading Style Sheets),定义了如何显示HTML元素. 目录 1. 选择器的分类:介绍ID.class.元素名称.符合.层次.伪类.属性选择器. 2. 样 ...

  3. Android性能优化之巧用软引用与弱引用优化内存使用

    前言: 从事Android开发的同学都知道移动设备的内存使用是非常敏感的话题,今天我们来看下如何使用软引用与弱引用来优化内存使用.下面来理解几个概念. 1.StrongReference(强引用) 强 ...

  4. C++中的引用

    一,C++中引用的基础知识 1.引用的基本概念 1.所谓的引用其实就是对变量起“别名”.引用和变量对应得是相同的内存,修改引用的值,变量的值也会改变,和指针类似. 2.引用在定义的时候必须要初始化,初 ...

  5. Java 为值传递而不是引用传递

    ——reference Java is Pass by Value and Not Pass by Reference 其实这个问题是一个非常初级的问题,相关的概念初学者早已掌握,但是时间长了还是容易 ...

  6. EC笔记:第4部分:21、必须返回对象时,别返回引用

    使用应用可以大幅减少构造函数与析构函数的调用次数,但是引用不可以滥用. 如下: struct St { int a; }; St &func(){ St t; return t; } 在返回t ...

  7. EC笔记:第4部分:20、传递引用代替传值

    考虑以下场景: #include <iostream> #include <string> using namespace std; struct Person { strin ...

  8. 编译器开发系列--Ocelot语言2.变量引用的消解

    "变量引用的消解"是指确定具体指向哪个变量.例如变量"i"可能是全局变量i,也可能是静态变量i,还可能是局部变量i.通过这个过程来消除这样的不确定性,确定所引用 ...

  9. C++右值引用浅析

    一直想试着把自己理解和学习到的右值引用相关的技术细节整理并分享出来,希望能够对感兴趣的朋友提供帮助. 右值引用是C++11标准中新增的一个特性.右值引用允许程序员可以忽略逻辑上不需要的拷贝:而且还可以 ...

  10. 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...

随机推荐

  1. .NET / C# 时间与时间戳的转换

    时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总毫秒数. 我们在计算时间戳时应为1970年01月01日到指定时间. 应当注 ...

  2. Oracle使用中的常规操作总结

    写一篇在使用Oracle过程中一些常用的操作,以便于忘记的时候查看 一.创建用户和给用户赋予权限 create user 用户名 identified by 密码; --12c一下版本 create ...

  3. Visual C++ 2010 SP1 x86&x64

    Microsoft Visual C++ 2010 SP1 Redistributable Package (x86) https://www.microsoft.com/en-us/download ...

  4. 使用MHA实现MySQL主从复制高可用

    一.MHA简介        MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司的youshimaton(现就职于Fac ...

  5. 原生JS实现上拉下拉列表

    话不多说,代码上来,有些知识点直接就在注释里 HTML <div class="list-down"> <button id="btn"> ...

  6. js 对象克隆方法总结(不改变原对象)

    1.通用对象克隆: function clone(obj){ let temp = null; if(obj instanceof Array){ temp = obj.concat(); }else ...

  7. Java 之 可变字符序列:字符串缓冲区(StringBuilder 与 StringBuffer)

    一.字符串拼接问题 由于 String 类的对象内容不可改变,所以每当进行字符串拼接时,总是会在内存中创建一个新的对象. Demo: public class StringDemo { public ...

  8. 智能制造进入下半场?APS如何进行优化

    按照现在算法和计算机处理能力的发展,现在资源优化的方向已经逐渐摒弃,而是在更系统的“有限产能计划的”框架内一并解决产能和物料的问题. 我们所看到的新近涌现出来的很多APS系统.但碍于算法的复杂程度,在 ...

  9. .Net core3.0 集成swagger5.0上传文件

    .Net core 3.0已经更新了,相信有挺多博主大佬们都更新了如何在.Net core3.0使用swagger,这里就不详细说了. 我们知道,如果.net core 2.x使用swagger上传文 ...

  10. Linux 部署 YUM 仓库

    本篇主要写了怎么搭建自定义的YUM源,在一个拥有大量本地网络的主机环境中,可以减少对外网的依赖. Server 安装 vsftp 包 [root@server ~]# yum install vsft ...