



继承是面向对象编程中非常重要的概念,也是代码重复使用、提高开发效率的重要方式。下面的代码(/demo/tC1.php)创建了一个名为tC1的类。
本例中,在tC1类的m1()方法中使用_ _CLASS_ _显示当前类名,使用_ _METHOD_ _显示当前方法。在下面的代码中,先来看tC1类的基本应用。
<?php
require_once $_SERVER["DOCUMENT_ROOT"]."/demo/tC1.php";
$c1 = new tC1();
$c1->m1();
?>
代码执行结果见图6-7。
图 6-7
下面的代码在/demo/tC2.php文件中创建tC2类。
<?php
require_once "tC1.php";
class tC2 extends tC1
{
}
?>
代码中,tC2类没有创建任何成员,但在定义时使用extends关键字指定它继承于tC1类,此时,tC2类是tC1类的子类,tC1类则是tC2类的父类,也称为基类或超类。
作为子类,tC2类将可以使用tC1类的所有公共成员和受保护成员。下面的代码测试了tC2类的使用。
<?php
require_once $_SERVER["DOCUMENT_ROOT"]."/demo/tC2.php";
$c2 = new tC2();
$c2->m1();
?>
代码执行结果见图6-8。
图 6-8
本例中,$c2对象定义为tC2类的实例,但tC2类中并没有定义m1()方法,不过,tC2类继承了tC1类,所以,这里实际调用了tC1类中的m1()方法。
tC2类继承了tC1类的属性和方法等成员后,还可以根据需要对成员进行扩展。下面的代码就是在tC2类中添加m2()方法。
tC2类的m2()方法中,首先调用了m1()方法,然后会显示当前类和方法名称。请注意m1()方法的调用,这里使用了$this->m1()语句,实际上,tC2类中是没有m1()方法的,此时会自动向上调用父类中的m1()方法。此外,调用父类的成员,还可以使用parent关键字,如下面的代码。
下面的代码测试了m2()方法的使用。
<?php
require_once $_SERVER["DOCUMENT_ROOT"]."/demo/tC2.php";
$c2 = new tC2();
$c2->m2();
?>
代码执行结果见图6-9。
图 6-9
在继承关系中,需要注意instanceof运算符的操作结果。如本例中$c2对象是tC2类的实例,而tC2又继承于tC1类,那么,$c2 instanceof tC1的运算结果也会是true,下面的代码演示了此操作。
<?php
require_once $_SERVER["DOCUMENT_ROOT"]."/demo/tC2.php";
$c2 = new tC2();
var_dump($c2 instanceof tC2);
var_dump($c2 instanceof tC1);
?>
代码执行会显示两个bool(true)。
最后,如果一个类不允许继承,可以在定义时使用final关键字,如下面的代码。
此时,tC2类就不能被继承,如果有类使用extends关键字继承tC2类,会抛出类似图6-10中的错误信息。
图 6-10