类的继承性,是指一个新的子类可以从父类中派生出来,并且自动拥有父类的所有方法和属性。
继承类的应用
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();
