PHP变量作用域

@date:2015-12-07 17:48:00

PHP 的全局变量和 C 语言有一点点不同,在 C 语言中,全局变量在函数中自动生效,除非被局部变量覆盖,这可能引起一些问题,有些人可能不小心就改变了一个全局变量。PHP 中全局变量在函数中使用时必须声明为 global。
PHP: 变量范围 - Manual

全局变量 #

在函数范围之外所声明的变量就是全局变量。由于函数可以视为单独的程序片段,所以局部变量会覆盖全局变量的能见度,因此在函数中并无法直接调用使用全局变量。

局部变量 #

在函数之中声明的变量就是局部变量,并且该变量只有在函数范围之中才能加以使用。如果其它程序局部需要调用使用该变量值时,必须透过return指令,来将其传回至主程序区块以作后续处理。

函数内使用全局变量 #

1、通过传参方式将变量传入函数内部使用函数内部不能改变全局变量的值
可以在传参数时形参使用&符号与外部全局变量建立引用关系,这样可以更改全局变量的值。

$a=10;
function canshu($x){
	echo $x;
}

canshu($a);//输出10

2、通过global关键字声明一个与全局变量同名的局部变量需先声明后使用(实质上是建立了引用关系)此时在函数里面可以修改全局变量的值;unset后引用关系没有了,但外部全局变量依旧存在。

$a=10;

function quanju(){
    global $a;
    echo $a;
    unset($a);//unset后引用关系没有了,但外部全局变量依旧存在
    var_dump($a);//null
}

quanju();//输出10
echo '<br/>out:';
echo $a;//输出10

3、使用超全局数组GLOBALS
此时在函数里面可以修改全局变量的值;
unset后外部全局变量也不存在了。

$name='Bob';//全局变量$name也属于超全局数组GLOBALS的成员之一
echo '<pre>';
// print_r($GLOBALS);
echo '</pre>';

echo $GLOBALS['name'];


function chao(){
	echo $GLOBALS['name'];
	$GLOBALS['name']='Allen';//将改变外部全局变量$name的值
	unset($GLOBALS['name']);//将unset外部全局变量$name的值
}
echo '<br/>in:';
chao();//Bob

echo '<br/>out:';
var_dump($name);//null

静态变量(static) #

PHP支持声明函数变量为静态的(static)。

一个静态变量在所有对该函数的调用之间共享,并且仅在脚本的执行期间函数第一次被调用时被初始化。

要声明函数变量为静态的用关键字static。通常,静态变量的第一次使用时赋予一个初始值。

函数内使用静态变量关键字static声明的变量在执行完函数后不会被释放,下一次函数调用仍然生效。

function add(){
	static $a=0;
	echo $a;
	$a++;
}

add();//0
echo "<hr/>";
add();//1
echo "<hr/>";
add();//2

UPDATE
2016-1-9 16:54:19

Javascript语言函数内部可以直接读取全局变量。

学习Javascript闭包(Closure) - 阮一峰的网络日志
http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

Build by Loppo 0.6.14