/**
* 引用是符号表别名
*/
// $a与$b指向同一个变量
$a = &$b;
// 定义函数foo,参数为引用类型:&$var,无函数体
function foo(&$var) {
//
}
// 将未定义的$c传递给foo
foo($c);
// $c会被自动定义,并被赋值为NULL
var_dump($c); // NULL
// var_dump($d); // NULL,产生PHP警告:Notice: Undefined variable: d
// 定义数组$d
$d = array();
// 将$d['name']传递给foo
foo($d['name']);
// 数组$d中不存在键name,经过赋值给函数foo之后
// $d['name']被自动定义并被赋值为NULL
var_dump(is_null($d['name'])); // bool(true)
var_dump(array_key_exists('name', $d)); // bool(true)
// 创建StdClass对象$e
$e = new StdClass;
// 将age属性传递给函数foo
foo($e->age);
// 属性age被自动创建,并被赋值为NULL
var_dump(property_exists($e, 'age')); // bool(true)
var_dump($e->age); // NULL
// foreach中给一个具有引用的变量赋值
$ref = 0;
// 此时$ref与$row都指向$ref
$row = &$ref;
// 用foreach给$row赋值
foreach(array(1, 2, 3) as $row) {
//
}
echo $ref . PHP_EOL; // 3
// 用引用传递变量
function bar(&$var) {
++$var;
}
$f = 10;
// 参数$f不需要加&,只在bar函数定义时加&
bar($f);
echo $f . PHP_EOL; // 11
// 在函数内部给一个声明为global的变量赋于一个引用,该引用只在函数内部可见
// 可以用$GLOBALS数组避免这一点
$var1 = 'Example variable';
$var2 = '';
function global_references($use_globals) {
global $var1, $var2;
var_dump('$var1: ' . $var1);
var_dump('$var2: ' . $var2);
if (!$use_globals) {
$var2 = &$var1;
} else {
$GLOBALS['var2'] = &$var1;
}
}
global_references(false);
echo "when false, var2 = '$var2'\n";
global_references(true);
echo "when true, var2 = '$var2'\n";
// 输出结果
// string(23) "$var1: Example variable"
// string(7) "$var2: "
// when false, var2 = ''
// string(23) "$var1: Example variable"
// string(7) "$var2: "
// when true, var2 = 'Example variable'
$g = 1;
$h = &$g;
unset($g);
var_dump($g); // NULL, PHP Notice: Undefined variable: g
var_dump($h); // int(1)
// 用global $var声明一个变量时实际上建立了一个到全局变量的引用
// global $var; === $var = &$GLOBALS['var']; 两者是等价的
// unset($var)不会unset全局变量$GLOBALS,而是unset $GLOBALS['var']
global $var5;
echo '全局变量:' . PHP_EOL;
var_dump($GLOBALS['var5']); // NULL
unset($var5);
echo 'unset($var5)之后,全局变量:' . PHP_EOL;
var_dump($GLOBALS['var5']); // NULL, PHP Notice: Undefined index: var5

对php引用的理解的更多相关文章

  1. 【转】C++ 11 右值引用的理解

    右值引用的目的之一,是为了C++中一个比较影响性能的问题:拷贝临时对象,例如,在 int foo(){ ... } int x; x = foo(); 中,在第三句中,发生了以下的事情: 1.销毁 x ...

  2. Java中“指针”的解释以及对“引用”的理解

    Java中"指针"的解释以及对"引用"的理解 初学Java面对对象编程,对于一些概念还真的有点难以理解,主要是因为不由自主的联系到以前学过的C语言知识,时不时的 ...

  3. 《深入理解计算机系统》第7章:重定位PC相对引用的理解

    在第七章<链接>中的静态链接有对符号进行重定位PC相对引用的处理,书上对应的还有公式,但不是很好理解.现做实验对公式进行理解(公式内容如有兴趣可以参考原文)

  4. 对指针和引用的理解(c++)

    1.指针 typedef说明一种新类型名,来代替已有类型名. a.案例:typedef char* String_t和#define String_d char *这两句在使用上的区别? 1)前者声明 ...

  5. Java中对象和引用的理解

    偶然想起Java中对象和引用的基本概念,为了加深下对此的理解和认识,特地整理一下相关的知识点,通过具体实例从两者的概念和区别两方面去更形象的认识理解,再去记忆. 一.对象和引用的概念: 在Java中万 ...

  6. Spring的3级缓存和循环引用的理解

    此处是我自己的一个理解,防止以后忘记,如若那个地方理解不对,欢迎指出. 一.背景 在我们写代码的过程中一般会使用 @Autowired 来注入另外的一个对象,但有些时候发生了 循环依赖,但是我们的代码 ...

  7. python 05 关于对python中引用的理解

    数据的在内存中的地址就是数据的引用. 如果两个变量为同一个引用,那么这两个变量对应的数据一定相同: 如果两个变量对应的数据相同,引用不一定相同. 通过id(数据)可以查看数据对应的地址,修改变量的值, ...

  8. Office EXCEL 的绝对引用和相对引用如何理解

    比如C1 = A1+B1,则我把C1的单元格往下拖拉的时候,C2会自动等于A2+B2,C3会自动等于A3+B3,而如果让G1 = $E$1+$F$1,则把G1单元格往下拖拉的时候,G2G3单元格都不会 ...

  9. java import跨包引用类理解

    当前类要用其他类时,import具体包路径+.+具体的类 import引入的是被引用类的class文件,所以当我们build path第三方jar包时, 要用他们的类,要把jar包add to bui ...

  10. C++ 引用深入理解

    1.引用作为变量的别名存在,因此可以在一些场合代替指针. 引用相当于指针来说具有更好的可读性和实用性. 例如: /* 编译环境 gcc version 7.4.0 (Ubuntu 7.4.0-1ubu ...

随机推荐

  1. spring的@Value注解使用

    https://blog.csdn.net/woheniccc/article/details/79804600 昨天看到了springMVC的controller中的属性使用了@value注解,并且 ...

  2. 条款2:尽量使用const ,enum,inline替换define

    宁可使用编译器而不用预处理器 假设我们使用预处理器: #define ABC 1.56 这标识符ABC也许编译器没看到,也许它在编译器处理源码前就被预处理器移走了,于是“标识符”ABC没有进入标识符列 ...

  3. Kotlin——关于字符串(String)常用操作汇总

    在前面讲解Kotlin数据类型的时候,提到了字符串类型,当然关于其定义在前面的章节中已经讲解过了.对Kotlin中的数据类型不清楚的同学.请参考Kotlin——初级篇(三):数据类型详解这篇文章. 在 ...

  4. elasticsearch 进行聚合+去重查询

    转载:https://www.jianshu.com/p/c03c3c8bf583 以客户customer为例 我想查询每日的客户数. 先按照日期分桶,然后在桶内按照 姓名来去重 来计算客户数(实际会 ...

  5. [BZOJ4278] [ONTAK2015]Tasowanie 贪心+后缀数组

    题目链接 最近做题目好像有点东一榔头西一棒.好吧其实订正模拟题的时候需要用到什么感觉不太熟的就写一下吧. 显然直接贪心,比较两个点后面的串的字典序,小就选谁就可以了. 可以把两个串接起来,加一个\(i ...

  6. 【挖坟】HDU3205 Factorization

    分圆多项式 问题在于精度貌似出了一些奇怪的问题... [输出也写的有问题QAQ] 完全不会处理了 加上全网没有题解T^T 挖个坑以后补.. #include<cstdio> #includ ...

  7. 一次Linux服务器空间满的随笔解决记录

    昨天突然无法上传文件到服务器上的,FTP工具总是到99%就卡住了.查了一下说可能是服务器满了. 赶紧用 df -h 命令查看空间使用情况.果然100%了. 想想上次查询才不到50%,怎么突然就满了了呢 ...

  8. Mac OS 网络设置教程 wifi设置与宽带设置详解

    虽然所有设备连接无线网络的步骤都相差无几,但是Mac与windows系统还是不相同的,那么,苹果Mac怎么连接无线网络呢?针对此问题,本文就为大家介绍Mac网络的设置教程,有兴趣的朋友们可以了解下.如 ...

  9. boost variant

    Boost Variant resembles union. You can store values of different types in a boost::variant. 1. #incl ...

  10. 提高wifi速度的设置办法

    系列的提高wifi速度的设置办法 在DNS一栏有你们家的地址,在你们家的地址前输入“114.114.114.114”并以“,”结尾(注意:要用英文输入法哦.) 设置完后点击左上角的“无线局域网”回到初 ...