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