浅谈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将向Java靠拢
Oct 09 PHP
php 进度条实现代码
Mar 10 PHP
如何使用PHP批量去除文件UTF8 BOM信息
Aug 05 PHP
PHP获取指定函数定义在哪个文件中以及其所在的行号实例
May 08 PHP
PHP获取Exif缩略图的方法
Jul 13 PHP
Yii rules常用规则示例
Mar 15 PHP
phpmailer简单发送邮件的方法(附phpmailer源码下载)
Jun 13 PHP
php mysql like 实现多关键词搜索的方法
Oct 29 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
Sep 22 PHP
PHP操作XML中XPath的应用示例
Jul 04 PHP
PHP CURL实现模拟登陆并上传文件操作示例
Jan 02 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 18 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学习 函数 课件
2008/06/15 PHP
理解php Hash函数,增强密码安全
2011/02/25 PHP
php通用防注入程序 推荐
2011/02/26 PHP
推荐5款跨平台的PHP编辑器
2014/12/25 PHP
Symfony核心类概述
2016/03/17 PHP
PHP实现限制IP访问的方法
2017/04/20 PHP
PHP排序二叉树基本功能实现方法示例
2018/05/26 PHP
JS实现程序暂停与继续功能代码解读
2013/10/10 Javascript
原生js和jQuery随意改变div属性style的名称和值
2014/10/22 Javascript
Web表单提交之disabled问题js解决方法
2015/01/13 Javascript
JavaScript获取当前日期是星期几的方法
2015/04/06 Javascript
jQuery实现仿Google首页拖动效果的方法
2015/05/04 Javascript
JQuery实现带排序功能的权限选择实例
2015/05/18 Javascript
返回函数的JavaScript函数
2016/06/14 Javascript
KnockoutJS 3.X API 第四章之数据控制流if绑定和ifnot绑定
2016/10/10 Javascript
在vue里面设置全局变量或数据的方法
2018/03/09 Javascript
webpack external模块的具体使用
2018/03/10 Javascript
浅谈JavaScript窗体Window.ShowModalDialog使用
2020/07/22 Javascript
[01:40]2014DOTA2国际邀请赛 三冰SOLO赛后采访恶搞
2014/07/09 DOTA
Python中用于计算对数的log()方法
2015/05/15 Python
Python访问纯真IP数据库脚本分享
2015/06/29 Python
Python函数中的函数(闭包)用法实例
2016/03/15 Python
详解Python中open()函数指定文件打开方式的用法
2016/06/04 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
2018/03/05 Python
Python实现获取前100组勾股数的方法示例
2018/05/04 Python
python3 打印输出字典中特定的某个key的方法示例
2019/07/06 Python
详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法
2019/07/06 Python
python做接口测试的必要性
2019/11/20 Python
python实现图片插入文字
2019/11/26 Python
在tensorflow以及keras安装目录查询操作(windows下)
2020/06/19 Python
使用phonegap创建联系人的实现方法
2017/03/30 HTML / CSS
html5视频媒体标签video的使用方法及完整参数说明详解
2019/09/27 HTML / CSS
企业业务员岗位职责
2014/03/14 职场文书
领导干部“四风”问题批评与自我批评材料
2014/09/24 职场文书
公务员处分决定书
2015/06/25 职场文书
合作意向书怎么写
2019/06/24 职场文书