浅谈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 相关文章推荐
PHP制作图型计数器的例子
Oct 09 PHP
PHP备份/还原MySQL数据库的代码
Jan 06 PHP
php session安全问题分析
Jun 24 PHP
PHP将DateTime对象转化为友好时间显示的实现代码
Sep 20 PHP
解析php时间戳与日期的转换
Jun 06 PHP
解析CodeIgniter自定义配置文件
Jun 18 PHP
PHP批量上传图片的具体实现方法介绍.
Feb 26 PHP
PHP下的Oracle客户端扩展(OCI8)安装教程
Sep 10 PHP
WordPress中给媒体文件添加分类和标签的PHP功能实现
Dec 31 PHP
php实现购物车功能(以大苹果购物网为例)
Mar 09 PHP
PHP删除数组中特定元素的两种方法
Feb 28 PHP
PHP各种常见经典算法总结【排序、查找、翻转等】
Aug 05 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
汉字转化为拼音(php版)
2006/10/09 PHP
php smarty函数扩展
2010/03/15 PHP
php中jpgraph类库的使用介绍
2013/08/08 PHP
php使用strtotime和date函数判断日期是否有效代码分享
2013/12/25 PHP
回帖脱衣服的图片实现代码
2014/02/15 PHP
ThinkPHP应用模式扩展详解
2014/07/16 PHP
php实现三级级联下拉框
2016/04/17 PHP
自写的利用PDO对mysql数据库增删改查操作类
2018/02/19 PHP
一个用js实现的页内搜索代码
2007/05/23 Javascript
javascript中的注释使用与注意事项小结
2011/09/20 Javascript
有关于JS构造函数的重载和工厂方法
2013/04/07 Javascript
js中substring和substr的定义和用法
2014/05/05 Javascript
javascript实现获取浏览器版本、操作系统类型
2015/01/29 Javascript
js正则表达式中exec用法实例
2015/07/23 Javascript
jQuery 选择符详细介绍及整理
2016/12/02 Javascript
纯js三维数组实现三级联动效果
2017/02/07 Javascript
mui框架 页面无法滚动的解决方法(推荐)
2018/01/25 Javascript
vue.js移动数组位置,同时更新视图的方法
2018/03/08 Javascript
Vue自定义过滤器格式化数字三位加一逗号实现代码
2018/03/23 Javascript
微信小程序适配iphoneX的实现方法
2018/09/18 Javascript
vue 项目 iOS WKWebView 加载
2019/04/17 Javascript
vue基于v-charts封装双向条形图的实现代码
2019/12/09 Javascript
KMP算法精解及其Python版的代码示例
2016/06/01 Python
python中os模块详解
2016/10/14 Python
Python虚拟环境项目实例
2017/11/20 Python
Python使用Scrapy保存控制台信息到文本解析
2017/12/27 Python
python实现石头剪刀布小游戏
2021/01/20 Python
Python递归调用实现数字累加的代码
2020/02/25 Python
jupyter notebook 调用环境中的Keras或者pytorch教程
2020/04/14 Python
英国著名音像制品和图书游戏购物网站:Zavvi
2016/08/04 全球购物
迟到检讨书1000字
2014/01/15 职场文书
经理任命书模板
2014/06/06 职场文书
2014年银行员工工作总结
2014/11/12 职场文书
2015年精神文明建设工作总结
2015/04/21 职场文书
cf战队宣传语
2015/07/13 职场文书
2016年幼儿园教师政治学习心得体会
2016/01/23 职场文书