PHP static和global声明的变量的区别

static 变量

  • 仅在函数、方法内部具有全局性
static $config;
//或者
static $config = [];
  • 可以设置默认值
  • 未设置默认值时为null

测试一

var_dump(test('key1'));
var_dump(test('key2'));
var_dump(test('key3'));

function test($key)
{
    static $arr = [];
    $arr[$key] = microtime();
    return $arr;
}

exit;

运行结果

array(1) {
  ["key1"]=>
  string(21) "0.51881500 1658454973"
}
array(2) {
  ["key1"]=>
  string(21) "0.51881500 1658454973"
  ["key2"]=>
  string(21) "0.51981500 1658454973"
}
array(3) {
  ["key1"]=>
  string(21) "0.51881500 1658454973"
  ["key2"]=>
  string(21) "0.51981500 1658454973"
  ["key3"]=>
  string(21) "0.52102300 1658454973"
}

可以看出在函数内设置的static 变量,在函数被复用时,函数内部定义的static 变量也可以复用

测试二

试试在不同的函数内部使用,看看static 变量能否复用

var_dump(test1('key1'));
var_dump(test1('key2'));
var_dump(test2('key3'));
var_dump(test2('key4'));

function test1($key)
{
    static $arr = [];
    $arr[$key] = microtime();
    return $arr;
}

function test2($key)
{
    static $arr = [];
    $arr[$key] = microtime();
    return $arr;
}

exit;

运行结果

array(1) {
  ["key1"]=>
  string(21) "0.39255800 1658455525"
}
array(2) {
  ["key1"]=>
  string(21) "0.39255800 1658455525"
  ["key2"]=>
  string(21) "0.39386500 1658455525"
}
array(1) {
  ["key3"]=>
  string(21) "0.39517200 1658455525"
}
array(2) {
  ["key3"]=>
  string(21) "0.39517200 1658455525"
  ["key4"]=>
  string(21) "0.39541300 1658455525"
}

很明显,在不同的函数内部并不能复用static 变量

global 变量

  • 在整个进程内具有全局性(如环境变量$GLOBALS的全局性)。
global $_APP;
  • 不能设置默认值
  • 默认值为null

注意:给初次使用global声明的变量赋值前,打印一下该变量是否已经被声明过且不为null,即有可能在前面代码某个地方已经声明过。

  • 为了防止声明覆盖,变量名称以_开头且大写(但不可与环境变量同名,如$_FILES、$_GET、$_POST

测试

只需将上面测试二的代码的static改成global即可

var_dump(test1('key1'));
var_dump(test1('key2'));
var_dump(test2('key3'));
var_dump(test2('key4'));

function test1($key)
{
    global $arr;
    $arr[$key] = microtime();
    return $arr;
}

function test2($key)
{
    global $arr;
    $arr[$key] = microtime();
    return $arr;
}

exit;

运行结果

array(1) {
  ["key1"]=>
  string(21) "0.59937100 1658455837"
}
array(2) {
  ["key1"]=>
  string(21) "0.59937100 1658455837"
  ["key2"]=>
  string(21) "0.59949800 1658455837"
}
array(3) {
  ["key1"]=>
  string(21) "0.59937100 1658455837"
  ["key2"]=>
  string(21) "0.59949800 1658455837"
  ["key3"]=>
  string(21) "0.60011900 1658455837"
}
array(4) {
  ["key1"]=>
  string(21) "0.59937100 1658455837"
  ["key2"]=>
  string(21) "0.59949800 1658455837"
  ["key3"]=>
  string(21) "0.60011900 1658455837"
  ["key4"]=>
  string(21) "0.60035700 1658455837"
}

很明显,在不同的函数内部会复用global 变量

不仅是在同一个文件内的不同函数。
只要是在同一个进程内,不同的函数、文件、类、方法都可以复用global 变量,感兴趣的可以自己去测试看看。
因而global 变量存在风险,容易覆盖,而且很难定位到问题,尽量不要使用global 变量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值