[程序员每日5分钟]PHP 变量的作用域

一、什么是作用域

在 PHP 脚本的任何位置都可以声明变量,但是,声明变量的位置 直接影响访问变量的范围。这个可以访问的范围称为作用域scope。

二、作用域的几种类型

  • 局部变量
  • 函数参数
  • 全局变量
  • 静态变量

三、局部变量与全局变量

函数内部 声明的变量就是局部变量。

function getName(){
    $name = 'Anonymous66';
    echo $name;
}

getName(); // 输出 Anonymous66

函数变量和全局变量是完全隔绝的,也就是无法相互访问。

// 声明一个全局变量
$name = 'Anonymous66';
function getName(){
    echo $name;
}

getName(); // 报错 $name 未定义

那么,如何在函数内部访问全局变量呢?

// 声明一个全局变量
$name = 'Anonymous66';
function getName(){
    global $name;
    echo $name;
}

getName(); // 输出 Anonymous66

四、函数参数

参数是通过调用代码将值传递给函数的 局部变量

function getName($name){
    echo $name;
}

getName('Anonymous66'); // 输出 Anonymous66

五、静态变量

当一个函数完成时,它的所有变量通常都会删除,如果期望某个局部变量不被删除,在第一次声明变量时使用static关键字。静态变量在程序整个运行期间都不释放,直到整个程序运行结束。静态变量虽在程序的整个执行过程中始终存在,但是在它作用域之外不能使用。

function getName(){
    static $index = 1;
    $name = 'Anonymous66 ';
    echo $name . $index;
    
    $index++;
}

getName(); // 输出 Anonymous66 1
getName(); // 输出 Anonymous66 2
getName(); // 输出 Anonymous66 3
类中的静态变量

静态变量 属于类,而不属于类的某个实例。这个变量对所有实例都有效。
:: 是作用域限定操作符,这里用的是 self 作用域,而不是 $this 作用域,$this 作用域只表示类的当前实例,self:: 表示的是类本身。

class Man{
    public static $index = 1;  
    public function getIndex()
    {     
        self::index ++;
        echo self::index . '<br />';
    }
}

$ironMan = new Man();
$ironMan ->getIndex();

$SpiderMan = new Man();
$SpiderMan->getIndex();

// 输出结果:
// 2
// 3

六、总结

1、函数内想要访问全局变量需要使用global关键字。
2、函数参数是针对函数的局部变量
3、静态变量是跟随整个程序,直到结束,但是它也只能在自己的作用域使用。

推荐阅读更多精彩内容