PHP extends继承的用法(附带实例)
继承是 PHP 面向对象编程中非常重要的概念,也是代码重复使用、提高开发效率的重要方式。
下面的代码(/demo/tC1.php)创建了一个名为 tC1 的类:
在下面的代码中,先来看 tC1 类的基本应用。
下面的代码在 /demo/tC2.php 文件中创建 tC2 类:
作为子类,tC2 类将可以使用 tC1 类的所有公共成员和受保护成员。下面的代码测试了 tC2 类的使用:
tC2 类继承了 tC1 类的属性和方法等成员后,还可以根据需要对成员进行扩展。下面的代码就是在 tC2 类中添加 m2() 方法。
此外,调用父类的成员,还可以使用 parent 关键字,如下面的代码:
在继承关系中,需要注意 instanceof 运算符的操作结果。如本例中 $c2 对象是 tC2 类的实例,而 tC2 又继承于 tC1 类,那么,$c2 instanceof tC1 的运算结果也会是 true,下面的代码演示了此操作:
最后,如果一个类不允许继承,可以在定义时使用 final 关键字,如下面的代码:
下面的代码(/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
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 类,会抛出类似下图中的错误信息:
