首页 > 编程笔记 > PHP笔记 阅读:22

PHP extends继承的用法(附带实例)

继承是 PHP 面向对象编程中非常重要的概念,也是代码重复使用、提高开发效率的重要方式。

下面的代码(/demo/tC1.php)创建了一个名为 tC1 的类:
<?php
class tC1
{
    public $model;
    public $color;
    //
    public function ml()
    {
        echo __CLASS__,"<br>";
        echo __METHOD__;
    }
}
?>
本例中,在 tC1 类的 m1() 方法中使用 __CLASS__ 显示当前类名,使用 __METHOD__ 显示当前方法。

在下面的代码中,先来看 tC1 类的基本应用。
<?php
require_once $_SERVER["DOCUMENT_ROOT"]."/demo/tC1.php";

$c1 = new tC1();
$c1->m1();
?>
代码执行结果为:

tC1
tC1::m1


下面的代码在 /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();
?>
代码执行结果为:

tC1
tC1::m1

本例中,$c2 对象定义为 tC2 类的实例,但 tC2 类中并没有定义 m1() 方法,不过,tC2 类继承了 tC1 类,所以,这里实际调用了 tC1 类中的 m1() 方法。

tC2 类继承了 tC1 类的属性和方法等成员后,还可以根据需要对成员进行扩展。下面的代码就是在 tC2 类中添加 m2() 方法。
<?php
require_once "tC1.php";

class tC2 extends tC1
{
    public function m2()
    {
        $this->m1();
        echo "<br>";
        echo __CLASS__,"<br>";
        echo __METHOD__;
    }
}
?>
tC2 类的 m2() 方法中,首先调用了 m1() 方法,然后会显示当前类和方法名称。请注意 m1() 方法的调用,这里使用了 $this->m1() 语句,实际上,tC2 类中是没有 m1() 方法的,此时会自动向上调用父类中的 m1() 方法。

此外,调用父类的成员,还可以使用 parent 关键字,如下面的代码:
<?php
require_once "tC1.php";

class tC2 extends tC1
{
    public function m2()
    {
        parent::m1();
        echo "<br>";
        echo __CLASS__,"<br>";
        echo __METHOD__;
    }
}
?>
下面的代码测试了 m2() 方法的使用。
<?php
require_once $_SERVER["DOCUMENT_ROOT"]."/demo/tC2.php";

$c2 = new tC2();
$c2->m2();
?>
代码执行结果为:

tC1
tC1::m1
tC2
tC2::m2


在继承关系中,需要注意 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 关键字,如下面的代码:
<?php
require_once "tC1.php";

final class tC2 extends tC1
{
    public function m2()
    {
        $this->m1();
        echo "<br>";
        echo __CLASS__,"<br>";
        echo __METHOD__;
    }
}
?>
此时,tC2 类就不能被继承,如果有类使用 extends 关键字继承 tC2 类,会抛出类似下图中的错误信息:

相关文章