14.2.6 PHP中类的静态成员
静态成员包括静态方法和静态属性。类的静态成员与类的一般成员不同,静态成员与类的实例无关,只与类本身有关。这意味着,类的静态属性可以由该类所有的对象所共享,它类似于函数的全局变量,只是它只属于某个固定的类,并且有访问限制。类似地,静态方法也与特定的对象无关,它类似于全局函数。静态方法可以完全访问类的属性,也可以由对象的实例来访问。
在实际开发中,如果希望在不存在有效对象的时候调用一个方法,那么就可以使用静态方法。如代码14-5演示了如何在PHP的类中使用静态成员,该代码实现了一个简单的计数器。
代码14-5 PHP程序中类的静态成员14-5.php
01 <?php
02 class Counter
03 {
04 private static$count=0;//静态成员变量
05
06 function__construct()//构造函数
07 {
08 echo'<b>计数开始!</b><br/><br/>';
09 }
10 function__destruct()//析构函数
11 {
12 echo'<b>计数结束!</b><br/><br/>';
13 }
14 static function get_count()//静态成员函数
15 {
16 return self::$count;
17 }
18
19 static function counts()
20 {
21 self::$count++;//注意这里静态成员变量的使用方法,加self::
22 }
23 }
24
25 $c=new Counter();
26 $i=0;
27
28 while($i<5)
29 {
30 Counter:counts();//通过限定Count:直接调用静态函数counts(),并没有使用对象$c来调用
31 $i=Counter:get_count();
32 echo Counter:get_count()."<br/><br/>";
33 }
34 ?>
【代码解析】这段代码在Counter类中定义了一个静态属性$count,静态方法get_count()和counts()。在类的内部,使用这些成员时并没有使用$this变量,而是通过该类的命名空间,即使用self::,如代码第16行和第21行所示。在类的外部,当调用类的方法时,同样没有使用事先生成的实例对象$c,使用类似$c->get_count()的代码来调用类方法,而是通过Counter::来访问该类的静态方法,如代码第30、31行。因为这些方法都是静态方法,并不针对每个具体实例所有,而是所有的对象共享。这段代码的执行结果如图14-3所示。