6.7.2 重载

在本章中,我们已经介绍了如何在子类中声明新的属性和操作。在子类中,再次声明相同的属性和操作也是有效的,而且在有些情况下这将会是非常有用的。我们可能需要在子类中给某个属性赋予一个与其超类属性不同的默认值,或者给某个操作赋予一个与其超类操作不同的功能。这就叫重载。

例如,如果有类A:


class A

{

public$attribute="default value";

function operation()

{

echo"Something<br/>";

echo"The value of\$attribute is".$this->attribute."<br/>";

}

}


现在,如果需要改变$attribute的默认值,并为operation()操作提供新的功能,可以创建类B,它重载了$attribute和operation()方法,如下所示:


class B extends A

{

public$attribute="different value";

function operation()

{

echo"Something else<br/>";

echo"The value of\$attribute is".$this->attribute."<br/>";

}

}


声明类B并不会影响类A的初始定义。考虑如下所示的两行代码:


$a=new A();

$a->operation();


这两行代码创建了类A的一个对象并且调用了它的operation()函数。这将产生如下所示的输出:


Something

The value of$attribute is default value


以上结果是在创建类B没有改变类A的前提下产生的。如果创建了类B的一个对象,将得到不同的输出结果。

如下所示的代码:


$b=new B();

$b->operation();


将产生如下所示的结果:


Something else

The value of$attribute is different value


与子类中定义新的属性和操作并不影响超类一样,在子类中重载属性或操作也不会影响超类。

如果不使用替代,一个子类将继承超类的所有属性和操作。如果子类提供了替代定义,替代定义将有优先级并且重载初始定义。

parent关键字允许调用父类操作的最初版本。例如,要从类B中调用A::operation,可以使用如下所示的语句:


parent::operation();


但是,其输出结果却是不同的。虽然调用了父类的操作,但是PHP将使用当前类的属性值。因此,将得到如下所示的输出:


Something

The value of$attribute is different value


继承可以是多重的。可以声明一个类C,它继承了类B,因此继承了类B和类B父类的所有特性。类C还可以选择重载和替换父类的那些属性和操作。