PHP引用(&)的考察点
引用的概念
在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
的第一个元素的key
,value
被赋值给$key
和 $value
,此时$key=0
,$value=a
,执行$value = &$data[$key];
时,$value
指向$data[0]
;此时第一次循环结束,$data
值没有发生变化,还是['a','b','c']
;
第二次进入循环:$data
的第二个元素的key
,value
被赋值给$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引用(&)的考察点的更多相关文章
- PHP面试(一):PHP基础知识考察点、网页考察点、Linux考察点、MySQL考察点
一.基础知识考察 1.引用变量的概念及定义方式——引用变量的原理 2.常量及数据类型——字符串的三种定义方法及各自的区别 3.运算符的使用——错误控制符.运算符优先级 4.流程控制操作 5.自定义函数 ...
- php面试专题---3、运算符考察点
php面试专题---3.运算符考察点 一.总结 一句话总结: 逻辑运算符注意短路效果,优先级问题直接用括号,还要注意 ||和&&与or和and的优先级不同 1.foo()和@foo() ...
- (一)PHP基础知识考察点
1,PHP引用变量的考察点: 概念:引用就是用不同的名字访问同一个变量内容. 定义方式: 使用&符号. PHP引用变量的工作原理 这里有个COW copy on write 用zval() ...
- 【.net 深呼吸】序列化中的“引用保留”
假设 K 类中有两个属性/字段的类型相同,并且它们引用的是同一个对象实例,在序列化的默认处理中,会为每个引用单独生成数据. 看看下面两个类. [DataContract] public class 帅 ...
- CSS 选择器及各样式引用方式
Css :层叠样式表 (Cascading Style Sheets),定义了如何显示HTML元素. 目录 1. 选择器的分类:介绍ID.class.元素名称.符合.层次.伪类.属性选择器. 2. 样 ...
- Android性能优化之巧用软引用与弱引用优化内存使用
前言: 从事Android开发的同学都知道移动设备的内存使用是非常敏感的话题,今天我们来看下如何使用软引用与弱引用来优化内存使用.下面来理解几个概念. 1.StrongReference(强引用) 强 ...
- C++中的引用
一,C++中引用的基础知识 1.引用的基本概念 1.所谓的引用其实就是对变量起“别名”.引用和变量对应得是相同的内存,修改引用的值,变量的值也会改变,和指针类似. 2.引用在定义的时候必须要初始化,初 ...
- Java 为值传递而不是引用传递
——reference Java is Pass by Value and Not Pass by Reference 其实这个问题是一个非常初级的问题,相关的概念初学者早已掌握,但是时间长了还是容易 ...
- EC笔记:第4部分:21、必须返回对象时,别返回引用
使用应用可以大幅减少构造函数与析构函数的调用次数,但是引用不可以滥用. 如下: struct St { int a; }; St &func(){ St t; return t; } 在返回t ...
随机推荐
- linux系统编程:线程同步-信号量(semaphore)
线程同步-信号量(semaphore) 生产者与消费者问题再思考 在实际生活中,仅仅要有商品.消费者就能够消费,这没问题. 但生产者的生产并非无限的.比如,仓库是有限的,原材料是有限的,生产指标受消费 ...
- BZOJ 2208 JSOI2010 连通数 Tarjan+拓扑排序
题目大意:给定一个n个点的有向图,求有多少点对(x,y),使x沿边可到达y 设f[i][j]为从i到j是否可达 首先强联通分量中的随意两个点均可达 于是我们利用Tarjan缩点 缩点之后是一个拓扑图. ...
- Spring——IoC
控制反转(Inversion ofControl,英文缩写为IoC)是一种能够解耦的方法,不是什么技术.是一种思想,也是轻量级的Spring框架的核心.控制反转一般分为两种类型.依赖注入(Depend ...
- 用JAVA生成老电影海报
先看图,再讲原理.生成效果对照: 机器全自己主动生成.是不是非常酷炫?:) 数字图像,由无数个像素组成,通常情况下,每一个像素包括有RGB三个值,算法原理事实上非常easy: 一,遍历全部像素,将RG ...
- Android开源项目SlidingMenu的学习笔记(一)
SlidingMenu是眼下在应用程序上非常流行的一种UI技术.能够实现一种比較炫的滑动效果,SlidingMenu是Git上托管的一个项目,开源免费的.SlidingMenu作为一个Library的 ...
- NSSet所有API学习。
/****************集合(NSSet)和数组(NSArray)有相似之处,都是存储不同的对象的地址.只是NSArray是有序的集合,NSSet是无序的集合,同一时候NSSet能够保证数据 ...
- 2016/2/19 css样式表 Cascading Style Sheet 叠层样式表 美化HTML网页
一.样式表 (一)样式表的分类 1.内联样式表 和HTML联合显示,控制精确,但是可重用性差,冗余较多. 例:<p style="font-size:14px;">内联 ...
- ZOJ 3870 Team Formation 贪心二进制
B - Team Formation Description For an upcoming progr ...
- struts 模块化
<struts> <!-- 包含了三个配置文件 --> <!-- 不指定路径默认在src下时的方式 --> <include file="strut ...
- commons.fileupload 文件上传
编辑jsp页面获取文件 <html> <head> <base href="<%=basePath%>"> <title> ...