PHP 中的 GLOBAL 和 STATIC 变量到底有什么区别?当我们想在多个函数中使用一个变量时,哪个更可取?
谢谢。
静态变量只是意味着 var 属于一个类,但可以引用而不必实例化所述类。全局变量存在于全局命名空间中,并且可以被任何类中的任何函数引用。全局变量总是不受欢迎,因为它们很容易被滥用、覆盖、意外引用等。至少对于静态变量,您需要通过Class::var;
Global 用于获取可能在其他脚本中定义或不在同一范围内的全局变量。
例如
<?php
$g_var = 1;
function test() {
var_dump($GLOBAL['g_var']);
global $g_var;
var_dump($g_var);
}
static 用于定义一个具有整个脚本生命周期的 var,并且只初始化一次。
例如
<?php
function test() {
static $cnt = 0;
$cnt ++;
echo $cnt;
}
$i = 10;
while (-- $i) {
test();
}
全局变量是在作用域中定义的变量,可以跨越包含和必需的作用域。(简单来说,范围是指 php 文件/函数/类)
以下是全局变量如何工作的一些示例。
示例 1:在作用域中声明并在函数中使用global
关键字的变量
<?php
$a = 1;
function add_a() {
global $a;
$a++;
}
add_a();
echo $a;
在上面的示例中,我们声明了变量$a
并在范围内为其赋值1
。然后我们在同一范围内声明一个函数add_a
并尝试增加$a
变量值。该add_a
函数被调用,然后我们期望显示结果echo
的变量。$a
2
示例 2:在作用域中声明并在使用该变量的函数中使用的$GLOBALS
变量
<?php
$a = 1;
function add_a() {
$GLOBALS['a']++;
}
add_a();
echo $a;
上面示例 2 的结果与示例 1 的结果完全相同。
global
使用关键字和 PHP 定义的特殊$GLOBALS
数组变量没有区别。但是,它们都有其优点和缺点。
$GLOBALS
在 PHP 官方网站$GLOBALS上阅读更多信息
如果要将范围声明的变量跨越到包含或必需的范围,请参见下面的示例。
示例 3:
文件a.php
<?php
global $a;
$a = 1;
require 'b.php';
add_a();
echo $a;
文件b.php
<?php
function add_a() {
global $a;
$a++;
}
在上面的示例中,我们有文件a.php
和b.php
. 文件b.php
中需要文件a.php
,因为我们使用文件中声明的函数b.php
。要使用$a
文件中的变量,b.php
我们必须首先声明$a
为全局以在本地范围之外使用,我们首先调用来做到这一点global $a
,然后我们定义一个像这样的值$a = 1
。变量 $a 现在可以在任何包含的范围内的任何地方使用,方法是global $a
在操作之前先调用。
静态变量 通常存在于类中,但在一些开发良好的 PHP 项目中,您可以在递归函数中找到它们。静态变量是一个可以记住其值并且可以在每次调用函数或方法时重用的变量。
以下是使用中的静态变量的一些示例。
示例 1:函数中的静态变量
function add() {
static $a = 1;
$a++;
echo $a;
}
add(); //2
add(); //3
add(); //4
示例 2:类中的静态变量
class A {
public static $a = 1;
public static function add() {
self::$a++;
echo self::$a;
}
}
echo A::$a; //1
A::add(); //2
echo A::$a; //2
A::add(); //3
echo A::$a; //3
A::add(); //4
请注意,您不能将函数的返回值分配给静态变量。例如你不能做
static $a = rand()
. 请参阅下面的示例 3,了解如何将返回值分配给静态变量。
示例 3:将返回变量从函数分配给静态变量
function add() {
static $a;
$a = rand();
echo $a;
}
在 PHP 官方网站上阅读更多关于全局和静态变量的信息变量范围
全局变量是在创建函数之前创建的,但是在函数中添加了global关键字
$g_var = 1;
function test() {
var_dump($GLOBAL['g_var']);
global $g_var;
var_dump($g_var);
}
static 在函数中创建并声明为静态
function test() {
static $cnt = 0;
$cnt ++;
echo $cnt;
}
$i = 10;
while(--$i) test();