1. /**
  2. * 引用是符号表别名
  3. */
  4. // $a与$b指向同一个变量
  5. $a = &$b;
  6. // 定义函数foo,参数为引用类型:&$var,无函数体
  7. function foo(&$var) {
  8. //
  9. }
  10. // 将未定义的$c传递给foo
  11. foo($c);
  12. // $c会被自动定义,并被赋值为NULL
  13. var_dump($c); // NULL
  14. // var_dump($d); // NULL,产生PHP警告:Notice: Undefined variable: d
  15. // 定义数组$d
  16. $d = array();
  17. // 将$d['name']传递给foo
  18. foo($d['name']);
  19. // 数组$d中不存在键name,经过赋值给函数foo之后
  20. // $d['name']被自动定义并被赋值为NULL
  21. var_dump(is_null($d['name'])); // bool(true)
  22. var_dump(array_key_exists('name', $d)); // bool(true)
  23. // 创建StdClass对象$e
  24. $e = new StdClass;
  25. // 将age属性传递给函数foo
  26. foo($e->age);
  27. // 属性age被自动创建,并被赋值为NULL
  28. var_dump(property_exists($e, 'age')); // bool(true)
  29. var_dump($e->age); // NULL
  30. // foreach中给一个具有引用的变量赋值
  31. $ref = 0;
  32. // 此时$ref与$row都指向$ref
  33. $row = &$ref;
  34. // 用foreach给$row赋值
  35. foreach(array(1, 2, 3) as $row) {
  36. //
  37. }
  38. echo $ref . PHP_EOL; // 3
  39. // 用引用传递变量
  40. function bar(&$var) {
  41. ++$var;
  42. }
  43. $f = 10;
  44. // 参数$f不需要加&,只在bar函数定义时加&
  45. bar($f);
  46. echo $f . PHP_EOL; // 11
  47. // 在函数内部给一个声明为global的变量赋于一个引用,该引用只在函数内部可见
  48. // 可以用$GLOBALS数组避免这一点
  49. $var1 = 'Example variable';
  50. $var2 = '';
  51. function global_references($use_globals) {
  52. global $var1, $var2;
  53. var_dump('$var1: ' . $var1);
  54. var_dump('$var2: ' . $var2);
  55. if (!$use_globals) {
  56. $var2 = &$var1;
  57. } else {
  58. $GLOBALS['var2'] = &$var1;
  59. }
  60. }
  61. global_references(false);
  62. echo "when false, var2 = '$var2'\n";
  63. global_references(true);
  64. echo "when true, var2 = '$var2'\n";
  65. // 输出结果
  66. // string(23) "$var1: Example variable"
  67. // string(7) "$var2: "
  68. // when false, var2 = ''
  69. // string(23) "$var1: Example variable"
  70. // string(7) "$var2: "
  71. // when true, var2 = 'Example variable'
  72. $g = 1;
  73. $h = &$g;
  74. unset($g);
  75. var_dump($g); // NULL, PHP Notice: Undefined variable: g
  76. var_dump($h); // int(1)
  77. // 用global $var声明一个变量时实际上建立了一个到全局变量的引用
  78. // global $var; === $var = &$GLOBALS['var']; 两者是等价的
  79. // unset($var)不会unset全局变量$GLOBALS,而是unset $GLOBALS['var']
  80. global $var5;
  81. echo '全局变量:' . PHP_EOL;
  82. var_dump($GLOBALS['var5']); // NULL
  83. unset($var5);
  84. echo 'unset($var5)之后,全局变量:' . PHP_EOL;
  85. 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. MySQL语句优化方法(简单版)

    基础回顾: sql语句是怎么样运行的? 一般来说,客户端发送sql语句到数据库服务器——数据库服务器进行运算并返回结果——客户端显示sql语句运行结果. 在本地运行时以workbench为例,客户端为 ...

  2. linux shell 管道命令(pipe)使用及与shell重定向区别

    管道命令操作符是:”|”,它仅能处理经由前面一个指令传出的正确输出信息,也就是 standard output 的信息,对于 stdandarderror 信息没有直接处理能力.然后,传递给下一个命令 ...

  3. Linux centos7安装git

    1.下载git wget https://github.com/git/git/archive/v2.14.1.zip 2.安装依赖 yum -y install zlib-devel openssl ...

  4. tomcat启动一闪而过解决办法报错The CATALINA_HOME environment variable is not defined correctly

    解决办法: Tomcat无论在windows上还是Linux上只需要吧安装包传上去解压就行,不需要配置环境变量,吧之前有可能别人别配置的环境变量统一删掉即可(网上一大堆说需要配置的都是胡说八道).把以 ...

  5. HTML5 arc的例子

    demo.html <!DOCTYPE html> <html lang="zh"> <head> <meta charset=" ...

  6. 获取配置文件yml的@ConfigurationProperties和@Value的区别

    首先,配置文件的事,我没讲properties,这个写中文的时候,会有乱码,需要去Idea里面设置一下编码格式为UTF-8 还有,我们的类和配置文件直接关联,我用的是ConfigurationProp ...

  7. (HY000): Can't connect to MySQL server on '129.28.149.240' (113)

    环境 mysql5.7 ubuntu 一. 解决方法 1.首先确保mysql开启了远程授权:https://blog.csdn.net/cryhelyxx/article/details/401146 ...

  8. js实现动态加载input 提示信息

    思路:使用<datalist> 标签定义选项列表.请与 input 元素配合使用该元素,来定义 input 可能的值.datalist 及其选项不会被显示出来,它仅仅是合法的输入值列表.请 ...

  9. python多个装饰器

    '''在装饰器中加上参数:1.实现在源代码中加上时间统计:函数timmer2.实现用户名认证功能:函数auth23.实现一次认证,刷新后自动登录功能,index函数已经认证并登录,在执行home函数时 ...

  10. 改计算机名导致 Oracle因目标主机或对象不存在

    手贱修改了计算机名, 结果导致登陆oracle数据库报如下错误,一查资料,说是修改了计算机名导致的,需要进到oracle安装目录: \oracle\product\10.2.0\db_1\NETWOR ...