类的继承

继承是指子类继承父类所有公有的和受保护的属性和方法。继承关键字 extends,派生类和子类是指继承于基类的类,基类、父类和超类是指被继承的类。

TIPS

  1. 子类只能继承父类的非私有属性。
  2. 子类继承父类后,相当于将父类的属性和方法copy到子类,可以直接使用$this调用该属性;
  3. PHP只能单继承,不支持一个类继承多个类。但是一个类可以进行多层继承(即A继承于B,而C又继承于A,C通过A间接继承了B)
<?php
class Dad
{
    public $a = 'public';
    protected $b = 'protected';
    private $c = 'private';

    public function func1(){
        echo 'public func';
    }
    protected function func2(){
        echo 'protected func';
    }
    private function func3(){
        echo 'private func';
    }
}

class Son extends Dad
{   //Son类就拥有了所有Dad类的属性和方法,增加父类的扩展性
    //protected子类可以被继承,但不能被外部调用,private子类没有被继承,找不到属性或方法
    public function test(){
        $this->func1();
        $this->func2();
    }
}
$obj  = new Son();
echo $obj->test();

方法重写

定义:继承父类中的方法,子类中定义的与父类同名的方法。当一个子类重写其父类中的方法时,PHP不会调用父类中已被重写的方法。

可以使用关键字 parent:: 访问父类中的被重写的方法

<?php
class Dad
{
    public function byte(){
        echo 'abcd';
    }
}

class Son extends Dad
{
    public function byte(){
        echo 'efgh';
    }
    public function test(){
        $this->byte();
        parent::byte();
    }
}
$obj  = new Son();
echo $obj->byte();
$obj->test();

如果父类中的方法被声明为final,则子类无法重写该方法。如果一个类被声明为final,则不能被继承。

<?php

//final class Dad final 修饰类,则该类不能被继承
class Dad
{
    final public function test(){ //final 声明之后不能被重写
        echo 'hello world';
    }
}

class Son extends Dad
{
    public function test(){
        echo 'I\'m fine';
    }
}
$obj  = new Son();
$obj->test();