引用的概念

在PHP中引用意味着用不同的名字访问同一个变量内容。

定义方式

使用 & 符号来表示

变量的引用

$a = 'ABC'; //开辟一块内存空间存储数据,$a指向该空间
$b = &$a; //创建引用变量,此时$b也指向上述空间
echo $b; //输出ABC
$b = 'EFG'; //
echo $a; //输出EFG,$a 和 $b指向的是同一个变量,修改的是同一个变量

值得注意的是,PHP有一个COW机制(copy on wrtite):

$a = 'ABC';
$b = $a; //此时并没有使用引用变量,但是由于COW机制,$b 仍然指向$a的空间
$b = 'ABC'; //此时对$b 进行 了写操作 ,触发cow,$b指向新的空间,$a不发生变化

函数引用

对于函数的引用,值得一提的是,必须在申明和调用时都加上&才算是真正的引用。

<?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(),其实和普通的函数调用是一样的,只是获得了函数的返回值,而使用$a=&test()方式来调用,则$a指向了$b的地址,改变$a的值,也会改变$b的值。

对象的引用

<?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中,对象的复制是通过引用来实现的,如果想复制的话,可以使用__clone

取消引用

unset只会取消变量名和变量内容之间的联系,并不会销毁变量内容本身

<?php
$a = 1;
$b = &$a;
unset($b);
echo $a;//这里仍然会输出1,因为并没有销毁变量内容

考察题

<?php

    $data = ['a','b','c'];

    foreach ($data as $key => $value) {
$value = &$data[$key];
} /**
* 1、程序运行时,每一次循环结束后,变量$data的值是什么,请解释
* 2、程序执行完成后,变量$data的值是什么?
*/

第一次进入循环:$data的第一个元素的keyvalue被赋值给$key$value,此时$key=0$value=a,执行$value = &$data[$key];时,$value指向$data[0];此时第一次循环结束,$data值没有发生变化,还是['a','b','c']

第二次进入循环:$data的第二个元素的keyvalue被赋值给$key$value,此时$key=1$value=b,而此时的$value指向的是$data[0]的地址,因此$data[0]的值也变成b,执行$value = &$data[$key];时,$value指向$data[1];此时第二次循环结束,$data的值为['b','b','c']

后面类推,第三次循环结束$data的值为['b','c','c']

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

  1. PHP面试(一):PHP基础知识考察点、网页考察点、Linux考察点、MySQL考察点

    一.基础知识考察 1.引用变量的概念及定义方式——引用变量的原理 2.常量及数据类型——字符串的三种定义方法及各自的区别 3.运算符的使用——错误控制符.运算符优先级 4.流程控制操作 5.自定义函数 ...

  2. php面试专题---3、运算符考察点

    php面试专题---3.运算符考察点 一.总结 一句话总结: 逻辑运算符注意短路效果,优先级问题直接用括号,还要注意 ||和&&与or和and的优先级不同 1.foo()和@foo() ...

  3. (一)PHP基础知识考察点

    1,PHP引用变量的考察点: 概念:引用就是用不同的名字访问同一个变量内容. 定义方式: 使用&符号. PHP引用变量的工作原理 这里有个COW  copy on write  用zval() ...

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

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

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

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

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

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

  7. C++中的引用

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

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

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

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

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

随机推荐

  1. linux系统编程:线程同步-信号量(semaphore)

    线程同步-信号量(semaphore) 生产者与消费者问题再思考 在实际生活中,仅仅要有商品.消费者就能够消费,这没问题. 但生产者的生产并非无限的.比如,仓库是有限的,原材料是有限的,生产指标受消费 ...

  2. BZOJ 2208 JSOI2010 连通数 Tarjan+拓扑排序

    题目大意:给定一个n个点的有向图,求有多少点对(x,y),使x沿边可到达y 设f[i][j]为从i到j是否可达 首先强联通分量中的随意两个点均可达 于是我们利用Tarjan缩点 缩点之后是一个拓扑图. ...

  3. Spring——IoC

    控制反转(Inversion ofControl,英文缩写为IoC)是一种能够解耦的方法,不是什么技术.是一种思想,也是轻量级的Spring框架的核心.控制反转一般分为两种类型.依赖注入(Depend ...

  4. 用JAVA生成老电影海报

    先看图,再讲原理.生成效果对照: 机器全自己主动生成.是不是非常酷炫?:) 数字图像,由无数个像素组成,通常情况下,每一个像素包括有RGB三个值,算法原理事实上非常easy: 一,遍历全部像素,将RG ...

  5. Android开源项目SlidingMenu的学习笔记(一)

    SlidingMenu是眼下在应用程序上非常流行的一种UI技术.能够实现一种比較炫的滑动效果,SlidingMenu是Git上托管的一个项目,开源免费的.SlidingMenu作为一个Library的 ...

  6. NSSet所有API学习。

    /****************集合(NSSet)和数组(NSArray)有相似之处,都是存储不同的对象的地址.只是NSArray是有序的集合,NSSet是无序的集合,同一时候NSSet能够保证数据 ...

  7. 2016/2/19 css样式表 Cascading Style Sheet 叠层样式表 美化HTML网页

    一.样式表 (一)样式表的分类 1.内联样式表 和HTML联合显示,控制精确,但是可重用性差,冗余较多. 例:<p style="font-size:14px;">内联 ...

  8. ZOJ 3870 Team Formation 贪心二进制

                                                    B - Team Formation Description For an upcoming progr ...

  9. struts 模块化

    <struts> <!-- 包含了三个配置文件 --> <!-- 不指定路径默认在src下时的方式 --> <include file="strut ...

  10. commons.fileupload 文件上传

    编辑jsp页面获取文件 <html> <head> <base href="<%=basePath%>"> <title> ...