购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

6.6 继承

继承是面向对象编程中非常重要的概念,也是代码重复使用、提高开发效率的重要方式。下面的代码(/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 DEZQ2vVB3sWDb/BdMRhd8USQErzoL2d8KB7/cNbtkgg8o9Dq2XOsqDN8Kftjp3OH

点击中间区域
呼出菜单
上一章
目录
下一章
×