PHP学习之global变量

2017-02-20  本文已影响0人  哈啰于先生

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;
?>
打印结果都是空

因为全局变量销毁了,引用也销毁了(原文件没了,快捷方式也没了)

上一篇下一篇

猜你喜欢

热点阅读