Home  >  Article  >  Backend Development  >  php中静态变量的疑问

php中静态变量的疑问

WBOY
WBOYOriginal
2016-06-06 20:51:371023browse

为什么这样的输出结果都是ccc?

<?php static $arr = 'aaa';
var_dump($arr);
static $arr = 'ccc';
var_dump($arr);

但是这样却改变不了数组?

<?php static $arr = array();
$arr[] = 'sdsds';
$arr[] = 'xxx';
var_dump($arr);
static $arr = array();
var_dump($arr);

而这样会给数组新增元素?

static $arr = array();
$arr[] = 'sdsds';
$arr[] = 'xxx';
var_dump($arr);
static $arr = array('ww', 'vv');
var_dump($arr);

希望能讲下原理 :)

回复内容:

为什么这样的输出结果都是ccc?

<?php static $arr = 'aaa';
var_dump($arr);
static $arr = 'ccc';
var_dump($arr);

但是这样却改变不了数组?

<?php static $arr = array();
$arr[] = 'sdsds';
$arr[] = 'xxx';
var_dump($arr);
static $arr = array();
var_dump($arr);

而这样会给数组新增元素?

static $arr = array();
$arr[] = 'sdsds';
$arr[] = 'xxx';
var_dump($arr);
static $arr = array('ww', 'vv');
var_dump($arr);

希望能讲下原理 :)

static一般是用在function或者class里的, 这种用法比较少见
我认为,php引擎在扫到static的时候,会把静态声明的提到域的顶端

<?php static $arr = 'aaa';
var_dump($arr);
static $arr = 'ccc';
var_dump($arr);

也就变成了

<?php static $arr = 'aaa';
static $arr = 'ccc'; // 所以两个输出都是"ccc"
var_dump($arr);
var_dump($arr);

下一个演变成了

<?php static $arr = array();
static $arr = array();
$arr[] = 'sdsds';
$arr[] = 'xxx';
var_dump($arr);
var_dump($arr);  // 所以两个都是 [ "sdsda", "xxx" ]

第三个演变成了

<?php static $arr = array();
static $arr = array('ww', 'vv');
$arr[] = 'sdsds';
$arr[] = 'xxx';
var_dump($arr);  
var_dump($arr); //两个结果都是 ["ww","vv","sdsds","xxx"]

静态变量在执行前就已经初始化完了。不管初始化多少次,只有最后一次有用。不带上static就可以赋值。
你的所有

static $xxx = xxx;

都只有最后一句有用。

下面的代码应该能帮你理清思路:

<?php static $arr = array('1','2');
if (1 == 0) {
	static $arr = array('gga','gaga');
}
var_dump($arr);
?>

结果是:

array (size=2)
  0 => string 'gga' (length=3)
  1 => string 'gaga' (length=4)

第二个的第二次定义数组时是空的,应该是忽略。
你再把第一个的第二次定义改为'',看看结果。

学习了。。。

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn