教程集 www.jiaochengji.com
教程集 >  脚本编程  >  php  >  正文 PHP变量作用域与地址引用问题解析

PHP变量作用域与地址引用问题解析

发布时间:2017-08-18   编辑:jiaochengji.com
有关php变量作用域与php地址引用的问题,这在php编程中时常遇到,本文为大家解析下php变量作用域、php地址引用的相关细节,有需要的朋友参考下。

本节主要内容:
PHP变量作用域以及地址引用问题。

一,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引用:就是在变量、函数或者对象前加&.php中的引用就是想用不同的名字访问同一个变量的内容。

1、变量的引用:
 

复制代码 代码示例:
<?php
$a="ABC";
$b =&$a;
echo $a;//这里输出:ABC
echo $b;//这里输出:ABC
$b="EFG";
echo $a;//这里$a的值变为EFG 所以输出EFG
echo $b;//这里输出EFG

2、函数的传址调用
 

复制代码 代码示例:
<?php
function test(&$a)
{
$a=$a+100;
} // www.jbxue.com
$b=1;
echo $b;//输出1
test($b); //这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值了
echo "<br>";
echo $b;//输出101

3、函数的引用返回
 

复制代码 代码示例:
<?php
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、取消引用
 

复制代码 代码示例:
<?php
$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变量作用域与地址引用问题解析
有关PHP引用的解释
php定义变量几种
PHP变量详解和定义变量名的方法
学习邮件服务器之动态域名、子域名、二级域名
深入理解php中$GLOBALS与global区别
php global static与$GLOBALS的区别
php引用(&)符号详解
301用法与错误详解

[关闭]
~ ~