引用的概念

在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. HDU 5265 pog loves szh II (二分查找)

    [题目链接]click here~~ [题目大意]在给定 的数组里选两个数取模p的情况下和最大 [解题思路]: 思路见官方题解吧~~ 弱弱献上代码: Problem : 5265 ( pog love ...

  2. 第6章1节《MonkeyRunner源代码剖析》Monkey原理分析-事件源-事件源概览

    在上一章中我们有简要的介绍了事件源是怎么一回事.可是并没有进行详细的描写叙述.那么往下的这几个小节我们就须要把这方面的知识给补充完整. 这一节我们先主要环绕MonkeySourceNetwork这个事 ...

  3. RelativeLayout不能居中的解决的方法

    在LinearLayout中有个让元素居中的办法就是.比方在LinearLayout里有个TextView.设置TextView的gravity能够让其居中. 而在Realative里设置这个不起作用 ...

  4. [WebGL入门]五,矩阵的基础知识

    注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中假设有我的额外说明.我会加上[lufy:],另外.鄙人webgl研究还不够深入,一些专业词语,假设翻译有误,欢迎大家指 ...

  5. Python正則表達式小结(1)

    学习一段python正則表達式了, 对match.search.findall.finditer等函数作一小结  以下以一段网页为例,用python正則表達式作一个范例: strHtml = '''& ...

  6. Python爬虫(一):基本概念

    网络爬虫的定义          网络爬虫(Web Spider.又被称为网页蜘蛛.网络机器人,又称为网页追逐者),是一种依照一定的规则,自己主动的抓取万维网信息的程序或者脚本.另外一些不常使用的名字 ...

  7. python partial

    1 很好记忆 partial的第一个参数是函数,后面都是该函数的参数. 2 特殊的地方 partial第一个参数是函数名,但是第二个参数是另外一个函数名. 比如partial(filter, func ...

  8. HIbernate- SQLQuery 简易

    package cn.demo; import java.util.Arrays; import java.util.List; import org.hibernate.SQLQuery; impo ...

  9. H264--4--H264编码[7]

    ----------------------------------- 编码器输出格式 ---------------------------------- 总的来说H264的码流的打包方式有两种,一 ...

  10. luogu 1080 国王游戏

    题目大意: 有一些数对,每个数对的得分为它之前所有数对的左侧数之乘积除以它的右侧数 求重新排列后数列中所有数对中最大得分尽可能小(第一个数对不参与排序,仍然为第一个) 思路: 非常简单,可以根据它对后 ...