PHP作用域

5 阅读1分钟

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