您当前的位置: 首页 > 网站编程 > PHP教程 > 浅谈PHP变量作用域以及地址引用问题

浅谈PHP变量作用域以及地址引用问题

作者:不详 来源:网络 发布时间: 2014-08-14 21:33 点击:
这篇文章主要介绍了PHP变量作用域以及地址引用问题,有需要的朋友可以参考一下 作用域的概念: 在PHP脚本的任何位置都可以声明变量,但是,声明变量的位置会大大影响访问变量的范围。这个可以访问的范围称为作用域。 主要的常用的包括:局部变量、全局变量、静态变量。

浅谈PHP变量作用域以及地址引用问题

  这篇文章主要介绍了PHP变量作用域以及地址引用问题,有需要的朋友可以参考一下

  作用域的概念:

  在PHP脚本的任何位置都可以声明变量,但是,声明变量的位置会大大影响访问变量的范围。这个可以访问的范围称为作用域。

  主要的常用的包括:局部变量、全局变量、静态变量。

  1、局部变量:就是在函数内声明的变量,他保存在内存的栈内,所以访问速度很快。仅在函数内有效。

  2、全局变量:与局部变量相反,全局变量可以在程序的任何地方访问。只要在变量前面加关键字GLOBAL,就可以将其识别为全局变量。在整个php文件内有效。

  3、静态变量:用static修饰只存在于函数作用域的变量,函数执行结束后其值并不消失。注:初始化后不能再次进行初始化,不能用表达式来赋值。

  代码如下:

  function test()

  {

  static $b=0;//申明静态变量,放在函数外部声明的话,在函数内部是用不到的

  $b=$b+1;

  echo $b;

  }

  test();//这条语句会输出$b的值为1

  test();//这条语句会输出$b的值为2

  注:static $b=0 这一赋值操作只会在变量第一次被初始化的时候执行。

  附A:类中静态成员和静态方法,差不多只是调用的时候统一使用类名或者self或者parent加::xxx,他们的作用域和这个一样,但是他的声明是在方法外部的

  附B:js里面的作用域使:用var aa=‘xxx';在函数外面声明的就是全局变量(不管是否带有修饰符var)。在函数内部使用 var声明的是局部变量,不使用var修饰的是全局变量。

  附C:关于引用

  PHP引用:就是在变量、函数或者对象前加&.php中的引用就是想用不同的名字访问同一个变量的内容。

  1、变量的引用:

  代码如下:

  $a="ABC";

  $b =&$a;

  echo $a;//这里输出:ABC

  echo $b;//这里输出:ABC

  $b="EFG";

  echo $a;//这里$a的值变为EFG 所以输出EFG

  echo $b;//这里输出EFG

  2、函数的传址调用

  代码如下:

  function test(&$a)

  {

  $a=$a+100;

  }

  $b=1;

  echo $b;//输出1

  test($b); //这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值就可以改变$b的值了

  echo "<br>";

  echo $b;//输出101

  3、函数的引用返回

  代码如下:

  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,而不会影响到$b。这样调用和普通的调用没区别。

  Php规定:$a=&test()方式得到才是函数的引用返回。他将$b变量的内存地址和$a变量的内存地址指向了同一个地方。即相当于$a=&$b;

  4、取消引用

  代码如下:

  $a = 1;

  $b =& $a;

  unset ($a);

  echo $b;

  解析:unset一个引用,只是取消了变量名和变量的内容之间的绑定,并不意味着内容被销毁,其值还是真实存在的。

  5、global引用:使用global $var 声明一个变量时,其实就是建立了一个到全局变量的引用。Global $val <=> $var=&$GLOBALS[‘var'] ;

  6、对象的引用:在对象的方法中,$this调用的对象都是调用它的引用

  注:php中对于地址的指向不是由用户自己来实现的,而是通过zend核心实现的,php的引用采用的是“写拷贝”的原理,就是除非发生写操作,指向同一个地址的变量或对象是不会被拷贝的。

  代码如下:

  $a = 1;

  $b =$a;

  $a和$b都是指向同一个内存地址,并不是$a和$b占用不同的内存。

  若是现在执行一句$a=”dsd”:$a和$b所指向的内存数据需要重新写一次,此时zend核心会自动判断。自动为$b产生一个$a的数据拷贝,重新申请一块内存进行存储。
分享到:
本文"浅谈PHP变量作用域以及地址引用问题"由远航站长收集整理而来,仅供大家学习与参考使用。更多网站制作教程尽在远航站长站。
顶一下
(0)
0%
踩一下
(0)
0%
[点击 次] [返回上一页] [打印]
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
关于本站 - 联系我们 - 广告合作 - 网站声明 - 友情连接- 网站地图 - 站点地图 - 返回顶部
Copyright © 2007-2013 www.yhzhan.com(远航站长). All Rights Reserved .
远航站长:为中小站长提供最佳的学习与交流平台,提供网页制作与网站编程等各类网站制作教程.
官方QQ:445490277 网站群:26680406 网站备案号:豫ICP备07500620号-4