类的继承性,是指一个新的子类可以从父类中派生出来,并且自动拥有父类的所有方法和属性。
继承类的应用
PHP只支持单继承,不允许多重继承。一个子类只能有一个父类,不允许一个类直接继承多个类,但一个类可以被多个类继承。
可以有多层继承,即一个类可以继承某一个类的子类,如类 B 继承了类 A,类C 又继承了类 B,那么类 C 也间接继承了类 A。
class A{ …… }
class B extends A{ …… }
使用类的继承性需要注意以下内容:
1.如果子类中没有构造方法,子类会自动调用父类的构造方法;
2.如果子类中有自己的构造方法,就执行子类自己的构造方法;
3.在子类中使用父类的方法,有两种方法 parent::方法() 或 $this->方法() 。建议用第一种方法,会让代码结构更清晰。
4.如果子类中存在一个与父类同名的方法,那么使用 parent::方法() 调用父类的方法,使用 $this->方法() 调用子类自己的方法。(这个也被称为 子类重载父类方法)
5.父类的属性的引用方法是 $this->属性。属性是不能区分父类还是子类的。
以下是栗子:
//类的继承 class person{ public $name; private $sex; protected $age; public function __construct($name,$sex,$age){ $this->name = $name; $this->sex = $sex; $this->age = $age; } public function say(){ echo '我是'.$this->name.',今年'.$this->age.'岁,性别是'.$this->sex.'<br>'; } } class stu extends person{ public $grade; public function __construct($name,$sex,$age,$grade){ //重构构造方法 parent::__construct($name,$sex,$age); //调用父类的构造方法 $this->grade = $grade; } public function student(){ echo '我是一名'.$this->grade.'年级的学生,我叫'.$this->name.'今年'.$this->age.'岁,性别是'.$this->sex.'<br>'; } public function say(){ echo '这是子类的say()方法<br>'; } public function action1(){ parent::say(); //调用父类中的say()方法 } public function action2(){ $this->say(); //调用子类中的say()方法 } } $s = new stu('小明','男',12,'五'); $s->student(); //输出结果是"我是一名五年级的学生,我叫小明今年12岁,性别是",无法输出性别,因为sex是私有属性 $s->say(); //输出结果是"这是子类的say()方法" $s->action1(); //输出结果是"我是小明,今年12岁,性别是男" $s->action2(); //输出结果是"这是子类的say()方法"
禁止类的继承 - final类 和 final方法
1.final类不能被继承:如果我们不想让一个类被继承,可以用 final 去修饰它
final class person{ ...... }
如下面的栗子:
//类继承的 final final class person1{ public $name; private $sex; protected $age; public function __construct($name,$sex,$age){ $this->name = $name; $this->sex = $sex; $this->age = $age; } public function say(){ echo '我是'.$this->name.',今年'.$this->age.'岁,性别是'.$this->sex.'<br>'; } } //class stu1 extends person1{} //无法继承,会报错
2.final父类方法,子类不能重载(重写)此父类方法
public final say(){ ...... }
如下面的栗子:
//类方法的final class person2{ public $name; private $sex; protected $age; public function __construct($name,$sex,$age){ $this->name = $name; $this->sex = $sex; $this->age = $age; } public final function say(){ echo '我是'.$this->name.',今年'.$this->age.'岁,性别是'.$this->sex.'<br>'; } } class stu2 extends person2{ /* 父类的final方法无法重写,会报错 public function say(){ echo '子类重写say()方法'; } */ } $s2 = new stu2('小丽','女',16); $s2->say();