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 变量
。