浅谈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 相关文章推荐
3.从实例开始
Oct 09 PHP
文章推荐系统(三)
Oct 09 PHP
用PHP动态生成虚拟现实VRML网页
Oct 09 PHP
php下实现在指定目录搜索指定类型文件的函数
Oct 03 PHP
php下载excel无法打开的解决方法
Dec 24 PHP
php对关联数组循环遍历的实现方法
Mar 13 PHP
使用PHPExcel操作Excel用法实例分析
Mar 26 PHP
7个鲜为人知却非常实用的PHP函数
Jul 01 PHP
PHP版本升级到7.x后wordpress的一些修改及wordpress技巧
Dec 25 PHP
Smarty变量用法详解
May 11 PHP
php curl 模拟登录并获取数据实例详解
Dec 22 PHP
关于laravel5.5的定时任务详解(demo)
Oct 23 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 dirname(__FILE__) 获取当前文件的绝对路径
2011/06/28 PHP
php 中的4种标记风格介绍
2012/05/10 PHP
PHPExcel内存泄漏问题解决方法
2015/01/23 PHP
js的event详解。
2006/09/06 Javascript
Javascript 实现复制(Copy)动作方法大全
2014/06/20 Javascript
JS onkeypress兼容性写法详解
2016/04/27 Javascript
JS版微信6.0分享接口用法分析
2016/10/13 Javascript
js利用appendChild对标签进行排序的实现方法
2016/10/16 Javascript
通过原生JS实现为元素添加事件的方法
2016/11/23 Javascript
vue中的非父子间的通讯问题简单的实例代码
2017/07/19 Javascript
详解vue 模版组件的三种用法
2017/07/21 Javascript
Js利用console计算代码运行时间的方法示例
2017/09/24 Javascript
js+html5生成自动排列对话框实例
2017/10/09 Javascript
详解vue-cli中模拟数据的两种方法
2018/07/03 Javascript
layui点击导航栏刷新tab页的示例代码
2018/08/14 Javascript
Bootstrap Paginator+PageHelper实现分页效果
2018/12/29 Javascript
Nodejs让异步变成同步的方法
2019/03/02 NodeJs
微信小程序实现电子签名功能
2020/07/29 Javascript
解决vant title-active-color与title-inactive-color不生效问题
2020/11/03 Javascript
javascript this指向相关问题及改变方法
2020/11/19 Javascript
微信小程序视频弹幕发送功能的实现
2020/12/28 Javascript
Python2中的raw_input() 与 input()
2015/06/12 Python
Python获取文件所在目录和文件名的方法
2017/01/12 Python
Windows下anaconda安装第三方包的方法小结(tensorflow、gensim为例)
2018/04/05 Python
利用python打开摄像头及颜色检测方法
2018/08/03 Python
Python中对数组集进行按行打乱shuffle的方法
2018/11/08 Python
Django中ORM外键和表的关系详解
2019/05/20 Python
记录一下scrapy中settings的一些配置小结
2020/09/28 Python
Python Process创建进程的2种方法详解
2021/01/25 Python
利用CSS3实现平移动画效果示例代码
2016/10/12 HTML / CSS
Belvilla法国:休闲度假房屋出租
2020/10/03 全球购物
公司JAVA开发面试题
2015/04/02 面试题
2015年银行个人工作总结
2015/05/14 职场文书
生日祝酒词大全
2015/08/10 职场文书
高考百日冲刺决心书
2015/09/23 职场文书
关于@OnetoMany关系映射的排序问题,使用注解@OrderBy
2021/12/06 Java/Android