多态这个概念,在Java中指的是变量可以指向的对象的类型,可是变量声明类型的子类。对象一旦创建,它的类型是不变的,多态的是变量。
在PHP5中,变量的类型是不确定的,一个变量可以指向任何类型的数值、字符串、对象、资源等。我们无法说PHP5中多态的是变量。
我们只能说在PHP5中,多态应用在方法参数的类型提示位置。
一个类的任何子类对象都可以满足以当前类型作为类型提示的类型要求。所有实现这个接口的类,都可以满足以接口类型作为类型提示的方法参数要求。简单的说,一个类拥有其父类、和已实现接口的身份。
通过实现接口实现多态
下面的例子中,UserAdmin类的静态方法,要求一个User类型的参数。
在后面的使用中,传递了一个实现了User接口的类NormalUser的实例。代码成功运行。
03 |
public function getName(); |
04 |
public function setName($_name); |
07 |
class NormalUser implements User { |
09 |
public function getName(){ |
12 |
public function setName($_name){ |
18 |
public static function ChangeUserName(User $_user,$_userName){ |
19 |
$_user->setName($_userName); |
23 |
$normalUser = new NormalUser(); |
24 |
UserAdmin::ChangeUserName($normalUser,"Tom"); |
25 |
echo $normalUser->getName(); |
程序运行结果:
通过继承关系实现多态
下面是类和子类的关系。
03 |
public function getName(){} |
06 |
class NormalUser extends User { |
08 |
public function getName(){ |
11 |
public function setName($_name){ |
17 |
public static function ChangeUserName(User $_user,$_userName){ |
18 |
$_user->setName($_userName); |
22 |
$normalUser = new NormalUser(); |
23 |
UserAdmin::ChangeUserName($normalUser,"Tom"); |
24 |
echo $normalUser->getName(); |
程序运行结果: