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


Posted in PHP onDecember 27, 2013

作用域的概念:

在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 相关文章推荐
快速配置PHPMyAdmin方法
Jun 05 PHP
PHP下通过file_get_contents的代理使用方法
Feb 16 PHP
PHP运行环境配置与开发环境的配置(图文教程)
Jun 04 PHP
探讨:php中在foreach中使用foreach ($arr as &amp;$value) 这种类型的解释
Jun 24 PHP
php根据用户语言跳转相应网页
Nov 04 PHP
php 实现一个字符串加密解密的函数实例代码
Nov 01 PHP
yii2利用自带UploadedFile实现上传图片的示例
Feb 16 PHP
php实现登录页面的简单实例
Sep 29 PHP
解决在laravel中auth建立时候遇到的问题
Oct 15 PHP
PHP读取文件,解决中文乱码UTF-8的方法分析
Jan 22 PHP
Yii Framework框架开发微信公众平台示例
Apr 26 PHP
PHP获取当前时间不准确问题解决方案
Aug 14 PHP
一个好用的PHP验证码类实例分享
Dec 27 #PHP
PHP连接SQLServer2005方法及代码
Dec 26 #PHP
php截取中文字符串不乱码的方法
Dec 25 #PHP
php输入流php://input使用示例(php发送图片流到服务器)
Dec 25 #PHP
php二维数组排序方法(array_multisort usort)
Dec 25 #PHP
php缩小png图片不损失透明色的解决方法
Dec 25 #PHP
php查看请求头信息获取远程图片大小的方法分享
Dec 25 #PHP
You might like
Discuz板块横排显示图片的实现方法
2007/05/28 PHP
PHP最常用的ini函数分析 针对PHP.ini配置文件
2010/04/22 PHP
PHP 反射(Reflection)使用实例
2015/05/12 PHP
php实现URL加密解密的方法
2016/11/17 PHP
ExtJS 2.0实用简明教程 之Border区域布局
2009/04/29 Javascript
javascript 带有滚动条的表格,标题固定,带排序功能.
2009/11/13 Javascript
javascript 函数使用说明
2010/04/07 Javascript
JQuery在光标位置插入内容的实现代码
2010/06/18 Javascript
JavaScript 操作table,可以新增行和列并且隔一行换背景色代码分享
2013/07/05 Javascript
js获取或设置当前窗口url参数的小例子
2013/10/14 Javascript
JS实现随页面滚动显示/隐藏窗口固定位置元素
2016/02/26 Javascript
javascript 将共享属性迁移到原型中去的实现方法
2016/08/31 Javascript
javascript中setAttribute兼容性用法分析
2016/12/12 Javascript
jQuery遍历节点方法汇总(推荐)
2017/05/13 jQuery
layui框架中layer父子页面交互的方法分析
2017/11/15 Javascript
jquery中ajax请求后台数据成功后既不执行success也不执行error的完美解决方法
2017/12/24 jQuery
vue+iview+less+echarts实战项目总结
2018/02/22 Javascript
vue awesome swiper异步加载数据出现的bug问题
2018/07/03 Javascript
vue-路由精讲 二级路由和三级路由的作用
2020/08/06 Javascript
js实现点击选项置顶动画效果
2020/08/25 Javascript
Python利用turtle库绘制彩虹代码示例
2017/12/20 Python
浅谈使用Python内置函数getattr实现分发模式
2018/01/22 Python
解决python3 json数据包含中文的读写问题
2018/05/10 Python
python集合比较(交集,并集,差集)方法详解
2018/09/13 Python
python中的for循环
2018/09/28 Python
python scipy卷积运算的实现方法
2019/09/16 Python
python实现测试工具(一)——命令行发送get请求
2020/10/19 Python
css3实现信纸/同学录效果的示例代码
2018/12/11 HTML / CSS
莫斯科隐形眼镜网上商店:Linzi
2019/07/22 全球购物
外贸英语专业求职信范文
2013/12/25 职场文书
酒店行政人事部经理职务说明书
2014/02/26 职场文书
技校学生个人职业生涯规划范文
2014/03/03 职场文书
考察现实表现材料
2014/05/19 职场文书
庆六一宣传标语
2014/10/08 职场文书
Nginx反向代理及负载均衡如何实现(基于linux)
2021/03/31 Servers
MySQL下载安装配置详细教程 附下载资源
2022/09/23 MySQL