在看別人項目過程中,看到函數裏面很多static修飾的變量,關於static修飾的變量,作用域,用法越看越困惑,所以查了下資料。
static用法如下:
1.static 放在函數內部修飾變量
2.static放在類裏修飾屬性,或方法
3.static放在類的方法裏修飾變量
4.static修飾在全局作用域的變量
所表示的不同含義如下:
1.在函數執行完後,變量值仍然保存
如下所示:
1
2
3
4
5
6
7
8
9
10
|
<?php function testStatic()
{ static $val =
1; echo $val ; $val ++; } testStatic(); //output
1 testStatic(); //output
2 testStatic(); //output
3 ?> |
2.修飾屬性或方法,可以通過類名訪問,如果是修飾的是類的屬性,保留值
如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<?php class Person
{ static $id =
0; function __construct()
{ self:: $id ++; } static function getId()
{ return self:: $id ; } } echo Person:: $id ; //output
0 echo "<br/>" ; $p1 = new Person(); $p2 = new Person(); $p3 = new Person(); echo Person:: $id ; //output
3 ?> |
3.修飾類的方法裏面的變量
如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?php class Person
{ static function tellAge()
{ static $age =
0; $age ++; echo "The
age is: $age "; } } echo Person::tellAge(); //output
'The age is: 1' echo Person::tellAge(); //output
'The age is: 2' echo Person::tellAge(); //output
'The age is: 3' echo Person::tellAge(); //output
'The age is: 4' ?> |
4.修飾全局作用域的變量,沒有實際意義(存在着作用域的問題,詳情查看)
如下所示:
1
2
3
4
5
|
<?php static $name =
1; $name ++; echo $name ; ?> |
另外:考慮到PHP變量作用域
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<?php include 'ChromePhp.php' ; $age =0; $age ++; function test1()
{ static $age =
100; $age ++; ChromePhp::log( $age ); //output
101 } function test2()
{ static $age =
1000; $age ++; ChromePhp::log( $age ); //output
1001 } test1(); test2(); ChromePhp::log( $age ); //outpuut
1 ?> |
可以看出:這3個變量是不相互影響的,另外,PHP裏面只有全局作用域和函數作用域,沒有塊作用域
如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
|
<?php include 'ChromePhp.php' ; $age =
0; $age ++; for ( $i =0; $i <10; $i ++)
{ $age ++; } ChromePhp::log( $i ); //output
10; ChromePhp::log( $age ); //output
11; ?>
|