php的变量分为三类:局部变量,全局变量,静态变量
在一段php脚本中<?php >
,变量可以在任意位置声明,作用域的意思是指变量在脚本中的使用范围。
同样php的作用域分为三类:1、local(局部作用域) 2、global(全局作用域) 3、static(静态作用域)
local和global作用域
通常情况local和global作用域是容易混淆的,如何区分这两种作用域呢?规则如下:
1、函数外部声明的变量拥有全局作用域,只能在函数外部访问。
2、函数内部声明的变量拥有局部作用域,只能在函数内部访问。
请看下面一段
<?php
$var = '1'; //全局变量
function foo(){
$var = '2';//局部变量
}
foo();
echo $var;
?>
很明显打印的结果是:1
虽然两个变量名都叫var,但是确实完全不同的两个变量,也是两种不同的作用域,打印出的很明显是全局的变量。
global关键字
我们经常会遇到一种情况,在函数外部声明了一个全局变量后,我们想在函数内部访问或者修改这一全局变量,这里我们就需要使用一个叫global的关键字来实现。
还用刚刚那段代码,我们想在foo()
函数内部修改$var的值,像上面那样写法肯定是不行,
function foo(){
$var = '2';//这里只是相当于重新定义一个局部变量,只不过名字恰好跟var是相同的
}
我们需要借助global关键字来实现,
<?php
$var = '1';//全局变量
function foo(){
global $var;//在函数内创建一个局部变量,使用global关键字使其成为全局变量的同名引用
$var = '2';
}
foo();
echo $var;
?>
打印的结果是:2
$GLOBALS
说到global关键字,就不得不提$GLOBALS,$GLOBALS是超全局变量,在生成全局变量的时候,PHP 同时在名为 $GLOBALS的数组中存储了所有的全局变量。
<?php
$var = '1';//全局变量,即$GLOBALS['var'] = '1'
function foo(){
global $var; //全局变量的引用,即 $var = &$GLOBALS['var']
$var = '2';
}
foo();
echo $var;
?>
有兴趣的童鞋可以打印下var_dump($GLOBALS);
看看结果。
结合unset()
方法会更容易理解,看如下两段代码
第一段
<?php
$var = '1';//全局变量,即$GLOBALS['var'] = '1'
function foo(){
global $var; //全局变量的引用,即 $var = &$GLOBALS['var']
$var = '2';
unset($var);
}
foo();
echo $var;
?>
打印结果是:2
第而段
<?php
$var = '1';//全局变量,即$GLOBALS['var'] = '1'
function foo(){
global $var; //全局变量的引用,即 $var = &$GLOBALS['var']
unset($var);
$var = '2';
}
foo();
echo $var;
?>
打印结果是:1
因为我们知道global是生成一个全局变量的别名引用(类似于桌面上一个文件跟它的快捷方式)。引用的值修改后,全局变量的值也就修改了,在第一段代码中,修改了快捷方式的内容,原文件的内容也得到了修改,然后又删除了快捷方式(unset($var);
),所以结果是修改后的值。
但是在第二段代码中,在$var = '2';
之前使用了unset($var);
方法销毁了引用变量,所以导致全局的变量值并未修改。
再看一段代码
<?php
$var = '1';//全局变量,即$GLOBALS['var'] = '1'
function foo(){
global $var; //全局变量的引用,即 $var = &$GLOBALS['var']
unset($GLOBALS['var']);
$var = '2';
//或者在此调用unset($GLOBALS['var']);
}
foo();
echo $var;
?>
打印结果都是空
因为全局变量销毁了,引用也销毁了(原文件没了,快捷方式也没了)
网友评论