静态方法的规则和静态变量是相同的。使用ststic关键字可以将方法标识为静态方法,通过类的名称和作用域限定操作符::可以访问静态方法。
静态方法和非静态方法之间有一个很重要的区别,就是在调用静态方法时,我们不需要创建类的实例。
Program List:用类名作为参数
用类名作为参数可以解决非继承的静态问题。
01 |
<?php |
02 |
class Fruit
{ |
03 |
public static $category = "I'm
fruit" ; |
04 |
|
05 |
static function find( $class ) |
06 |
{ |
07 |
$vars =
get_class_vars( $class )
; |
08 |
echo $vars [ 'category' ]
; |
09 |
} |
10 |
} |
11 |
12 |
class Apple extends Fruit
{ |
13 |
public static $category = "I'm
Apple" ; |
14 |
} |
15 |
16 |
Apple::find( "Apple" ); |
17 |
?> |
程序运行结果:
1 |
I'm
Apple |
Program List:重写基类方法
在派生类重写基类的方法。
01 |
<?php |
02 |
class Fruit |
03 |
{ |
04 |
static function Foo
( $class = __CLASS__ ) |
05 |
{ |
06 |
call_user_func( array ( $class , 'Color' )); |
07 |
} |
08 |
} |
09 |
10 |
class Apple extends Fruit |
11 |
{ |
12 |
static function Foo
( $class = __CLASS__ ) |
13 |
{ |
14 |
parent::Foo( $class ); |
15 |
} |
16 |
17 |
static function Color() |
18 |
{ |
19 |
echo "Apple's
color is red" ; |
20 |
} |
21 |
} |
22 |
23 |
Apple::Foo(); //
This time it works. |
24 |
?> |
程序运行结果:
1 |
Apple's
color is red |
Program List:静态数组的使用
静态和const作用域都可以用::操作符访问,如果你想使用::操作符访问数组,你需要事先将数组声明为静态。
01 |
<?php |
02 |
class Fruit |
03 |
{ |
04 |
static $color = array ( 'color1' => 'red' , 'color2' => 'yellow' ); |
05 |
} |
06 |
07 |
class Apple |
08 |
{ |
09 |
public function __construct() |
10 |
{ |
11 |
var_dump(Fruit:: $color ); |
12 |
} |
13 |
} |
14 |
15 |
class Banana |
16 |
{ |
17 |
public function __construct() |
18 |
{ |
19 |
Fruit:: $color =
FALSE; |
20 |
} |
21 |
} |
22 |
23 |
new Apple(); //
prints array(2) { ["color1"]=> string(3) "red" ["color2"]=> string(6) "yellow" } |
24 |
echo '<br
/>' ; |
25 |
new Banana(); |
26 |
new Apple(); //
prints bool(false) |
27 |
?> |
程序运行结果:
1 |
array (2)
{ [ "color1" ]=>
string(3) "red" [ "color2" ]=>
string(6) "yellow" } |
2 |
bool(false) |
Program List:再来一个单例模式
Static真的很酷,下面的程序演示了如何获得一个已经存在的实例。
01 |
<?php |
02 |
class Singleton
{ |
03 |
04 |
private static $instance =null; |
05 |
private $value =null; |
06 |
07 |
private function __construct( $value )
{ |
08 |
$this ->value
= $value ; |
09 |
} |
10 |
11 |
public static function getInstance()
{ |
12 |
if (
self:: $instance ==
null ) { |
13 |
echo "<br>new<br>" ; |
14 |
self:: $instance = new Singleton( "values" ); |
15 |
} |
16 |
else { |
17 |
echo "<br>old<br>" ; |
18 |
} |
19 |
return self:: $instance ; |
20 |
} |
21 |
22 |
} |
23 |
24 |
$x =
Singleton::getInstance(); |
25 |
var_dump( $x ); //
returns the new object |
26 |
$y =
Singleton::getInstance(); |
27 |
var_dump( $y ); //
returns the existing object |
28 |
?> |
程序运行结果:
1 |
new |
2 |
object(Singleton)#1
(1) { [ "value:private" ]=>
string(6) "values" } |
3 |
old |
4 |
object(Singleton)#1
(1) { [ "value:private" ]=>
string(6) "values" } |