PHP的作用域分为四种:局部作用域、全局作用域、静态作用域及超全局作用域
全局作用域
是在函数外部定义的变量,它的作用范围是整个脚本,在函数内部不能访问全局变量,函数是有自己的独立作用域,全局空间也不能访问局部变量。
<?php
$global='global area';//全局变量
function display(){
echo $global;//全局变量不能在局部空间使用
}
display()
echo $global;
?>
局部作用域
局部变量一般定义在函数体和方法体内,局部空间不可访问全局变量,全局空间也不可访问局部变量。
<?php
$global='global area';
function display(){
$number=1
echo $global;//全局变量不能在局部空间使用
echo $number;
}
echo $number//出错
display();
?>
若要全局变量访问局部变量或局部变量访问全局变量。 可以使用超全局变量和global关键字。
超全局变量
超全局变量是 PHP 内置的、不受作用域限制的特殊变量 —— 无论在函数内、函数外,甚至类的方法里,都可以直接访问。
例如:$GLOBALS,是一个数组,用来访问所有的全局变量。
基本语法:$GLOBALS['变量名']
可以用来读取、修改、创建全局变量
<?php
$global='global area';
$age=10;
function display(){
echo $GLOBALS['global'];//读取
$GLOBALS['age']++;//修改
$GLOBALS['count']=22;//创建
//输出global area
}
display();
echo $age.$count;//输出11 22
?>
global关键字
它是一种在函数里面定义变量的方式,也能够实现全局访问局部,同时局部访问全局。
使用global关键字创建变量,外部存在着和它相同的变量,那在系统中函数内部定义的变量会指向外部变量所指向的内存空间,也就是同一个变量。
本质就是:在函数的内部和外部,对一个同名变量(全局和局部)使用同一块内存地址保存数据,从而实现共同拥有。
语法:global 变量名
<?php
$global='global area';
function display(){
global $global;//声明使用全局变量
echo $global;//可以使用
global $arc;
$arc='abc';
}
display();//输出global area
echo $arc;//输出abc
?>
在常量定义中,define定义的常量,作用域默认全局生效,而const定义的常量,受所在作用域限制。
静态变量
静态变量:static,是在函数内部定义的变量,使用 static 关键字修饰,函数运行结束所有局部变量都会清空,如果重新运行一下函数,所有的局部变量又会重新初始化,但是静态变量等到脚本结束才会重置,否则会保留上一次执行的值。
<?php
function display(){
$gloabal="abc";
static $count=1;
}
display();
?>
静态变量的作用是,为了一个函数被多次调用(跨函数数据共享),值保留这个特性类似于JS中的闭包。
<?php
function display(){
$gloabal=1;//局部变量,每一次函数调用结束后,都被初始化。
static $count=1;//静态变量,函数调用结束后,保留当前值,直到整个脚本结束。
echo $gloabal++.$count++."<br>";
}
display();
display();
display();
echo $count;//静态变量外部是无法访问的,它的作用域仅在函数体内
?>//结果为
//11
//12
//13