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

 更新时间:2013年12月27日 15:30:38   转载 作者:  
这篇文章主要介绍了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队列原理及基于队列的写文件案例

    PHP队列原理及基于队列的写文件案例

    这篇文章主要介绍了PHP队列原理及基于队列的写文件案例,较为详细的分析了队列的原理、定义方法并结合实例形式给出了php基于队列的写文件操作技巧,需要的朋友可以参考下
    2017-11-11
  • 『PHP』PHP截断函数mb_substr()使用介绍

    『PHP』PHP截断函数mb_substr()使用介绍

    截断文章标题,控制在15个文字,接下来为大家讲解下如何实现这个需求,感兴趣的朋友可以参考下哈
    2013-04-04
  • PHP+MySQL实现无极限分类栏目的方法

    PHP+MySQL实现无极限分类栏目的方法

    这篇文章主要介绍了PHP+MySQL实现无极限分类栏目的方法,涉及php操作数据库查询及结果集递归遍历的技巧,需要的朋友可以参考下
    2015-12-12
  • Ajax+PHP实现的模拟进度条功能示例

    Ajax+PHP实现的模拟进度条功能示例

    这篇文章主要介绍了Ajax+PHP实现的模拟进度条功能,结合实例形式分析了php结合ajax动态读取文件实现进度条功能的相关操作技巧,需要的朋友可以参考下
    2019-02-02
  • PHP设计模式之适配器模式原理与用法分析

    PHP设计模式之适配器模式原理与用法分析

    这篇文章主要介绍了PHP设计模式之适配器模式,简单描述了适配器模式的概念、原理并结合实例形式分析了php类适配器模式与对象适配器模式的具体定义与使用方法,需要的朋友可以参考下
    2018-04-04
  • PHP cookie与session会话基本用法实例分析

    PHP cookie与session会话基本用法实例分析

    这篇文章主要介绍了PHP cookie与session会话基本用法,结合实例形式分析了PHP cookie与session会话基本存储、设置、删除等相关使用方式,需要的朋友可以参考下
    2019-11-11
  • PHP预定义超全局数组变量小结

    PHP预定义超全局数组变量小结

    这篇文章主要介绍了PHP预定义超全局数组变量,结合实例形式总结分析了预定义超全局数组变量的特性、功能、使用方法及相关操作注意事项,需要的朋友可以参考下
    2018-08-08
  • PHP代码审核的详细介绍

    PHP代码审核的详细介绍

    本篇文章是对PHP代码审核进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • 详解PHP+AJAX无刷新分页实现方法

    详解PHP+AJAX无刷新分页实现方法

    这篇文章主要介绍了详解PHP+AJAX无刷新分页实现方法,需要的朋友可以参考下
    2015-11-11
  • PHP中使用unset销毁变量并内存释放问题

    PHP中使用unset销毁变量并内存释放问题

    PHP的unset()函数用来清除、销毁变量,不用的变量,我们可以用unset()将它销毁。但是某些时候,用unset()却无法达到销毁变量占用的内存!
    2012-07-07

最新评论