static变量的一些疑惑

来源:互联网 发布:软件消除会议室回声 编辑:程序博客网 时间:2024/06/13 22:26
<?phpfunction test($name){static $_trace =  array();$_trace[]=$name;var_dump($_trace);}for ($i=0; $i <3 ; $i++) { test($i);}?>

上面的函数,输出的结果是

array  0 => int 0
array  0 => int 0  1 => int 1
array  0 => int 0  1 => int 1  2 => int 2
搜了下资料,说是定义static变量的这个动作之后执行一次,因为在第一次循环执行的时候已经定义了$_trace了,所以第二次循环的时候,再执行这句话,就不会在执行了

但是

<?phpfunction test($name){static $_trace =  array();$_trace[]=$name;static $_trace =  array(1,2);static $_trace =  array(1,2,3);  static $_trace =  array(1,2,3,'aaa','aadd');var_dump($_trace);}for ($i=0; $i <3 ; $i++) { test($i);}?>
按照我的理解来说,结果应该是和开始的函数是一样的,但是

array  0 => int 1  1 => int 2  2 => int 3  3 => string 'aaa' (length=3)  4 => string 'aadd' (length=4)  5 => int 0array  0 => int 1  1 => int 2  2 => int 3  3 => string 'aaa' (length=3)  4 => string 'aadd' (length=4)  5 => int 0  6 => int 1array  0 => int 1  1 => int 2  2 => int 3  3 => string 'aaa' (length=3)  4 => string 'aadd' (length=4)  5 => int 0  6 => int 1  7 => int 2
可以看出,定义static的值在函数运行最初的时候就定义好了,然后再才是开始执行函数的动作,否则数组也不会是这样的顺序

然后,总共有四个定义static的语句,但是,最后输出出来的是最后一个的定义的值,那么,当php在遇到定义static变量是在执行之前先比较这条语句在之前定义的时候是不是以相同的语句执行的,如果是,就不执行这条语句,不然则重新定义静态变量,还是在程序执行之前,直接取出最后一条,然后只执行最后一条定义语句???

纠结......


0 0