PHP 中变量的作用域可以分为: 超全局 (全局变量的特殊类型, 在局部范围里可直接使用), 全局, 局部, 静态 (是局部变量的特殊类型)
在 PHP 中, 全局变量实际上是静态全局变量, 如果不用 unset 显式的释放, 那么等脚本运行结束全局变量才会被释放掉
局部静态变量细分可以是 局部静态函数变量 (函数中声明的 static 变量), 局部静态成员变量 (类中声明的 static 属性, 被所有类实例共享)
局部静态变量只有脚本运行结束才会被自动释放
超全局变量: 在一个脚本的任何作用域里都可以被访问, 这些都是 PHP 内置的
代码如下:
- $GLOBALS
- $_SERVER
- $_GET
- $_POST
- $_FILES
- $_SESSION(持久化存储)
- $_COOKIE(持久化存储)
- $_REQUEST
- $_ENV
全局变量: 声明的变量不在 class,function,if 等语言结构内部, 如果要在 class,function,if 等语言内部使用, 需要用关键词 global 或者超全局变量 $GLOBALS
静态变量: 在 function 中使用关键词 static 声明的变量, 静态变量的值保留直至脚本结束
局部变量: 在 class,function,if/while/for 等结构语句内部声明的变量
1.global 关键词和 $GLOBALS 实例
代码如下:
- $a = 0;
- function foo()
- {
- global $a;
- echo $a;
- }
- function foo2()
- {
- echo $GLOBALS['a'];
- }
2.static 变量和普通局部变量区别实例
代码如下:
- function foo1()
- {
- $var = 0;
- $var++;
- return $var;
- }
- echo foo1();
- echo foo1();
- // 输出都是 1
- function foo ()
- {
- static $var = 0;
- $var++;
- return var;
- }
- echo foo();
- echo foo();
- // 第一次输出 1 第二次 2
3.static 关键词还可以声明静态属性和静态方法
静态属性只能被类调用, 而不能被类实例调用
静态方法里不能使用 $this, 只能用 self 访问类的静态属性
另外理解 static 变量的一段代码:
代码如下:
- class t
- {
- static $v = 10;
- public function a()
- {
- static $var = 10;
- $var++;
- echo $var . "\n";
- }
- public static function aa()
- {
- self::$v++;
- echo self::$v . "\n";
- }
- }
- $o1 = new t();
- $o1->a();// 输出 11
- $o2 = new t();
- $o2->a();// 输出 12
- t::aa();// 输出 11
- $o1->aa();// 输出 12
- $o2->aa();// 输出 13
从上面的代码中, 可知如果一个类成员方法中有静态变量, 即使是不同的类实例, 他们也会共享这个静态变量, 尽管这个静态变量不是类静态成员变量, 这点容易让人迷惑
来源: https://www.php1.cn/detail/php-9a507ff009.html