🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
extends继承 >[danger]class 子类名 extends 父类名{...} 1.子类继承了父类,继承所有的属性和方法,但是私有属性和方法不可以调用 2.子类可以重写父类中的属性和方法,直接重新定义属性和方法  3.调用规则: | | 类外部 | 类内部 | 子类 | | --- | --- | --- | --- | | public | 可以 | 可以 | 可以 | | protected  | **不可以**  | 可以  | **可以**| | private  | **不可以** | 可以 | **不可以** |                                                                                 4.如果父类定义方法时使用了 final,则该方法不可被覆盖(有固定不变的方法用final修饰)。可以**通过 parent:: 来访问被覆盖的方法或属性**。同样如果一个类被声明为 final,则不能被继承 父类定义了析构函数,如果子类也定义了析构函数那么父类的析构函数将不被继承,但是可以通过 **:parent::父类函数 或 父类名::父类函数调用此析构函数** **5.只能继承一个父类,不能同时继承多个父类** ``` // 定义父类 class Kang {   public $name = '玄烨';   protected $country = '清朝';   private $wife = '赫舍里';   public function info()   { echo "{$this->name}是{$this->country}的皇帝,她的老婆的是{$this->wife}";   } } // 定义子类 class Yong extends Kang { } // 实例化Yong $y = new Yong; // 调用属性 echo $y->name;//输出:玄烨是清朝的皇帝,她的老婆的是赫舍里 // echo $y->country;//Fatal error: Cannot access protected property致命错误:无法访问受保护的属性 // echo $y->wife;//Notice: Undefined property:报未定义的属性 // 方法 $y->info(); echo $y->info(); echo ''; var_dump($y); /* object(Yong)#1 (3) { ["name"]=> string(6) "玄烨" ["country":protected]=> string(6) "清朝" ["wife":"Kang":private]=> string(9) "赫舍里" } 从打印的$y和echo $y->info();可以看出子类继承了父类,把所有的属性和方法全部继承下来但是属性和方法的值没有改变;如果我们要想子类的值那么就涉及到子类的覆盖 */ ``` **例子2 子类的覆盖:** ``` class Kang {  public $name = '玄烨';  protected $country = '清朝';  private $wife = '赫舍里';  public function info()  {   echo "{$this->name}是{$this->country}的皇帝,他的老婆是{$this->wife}";  } } class Yong extends Kang {  // 子类继承了父类,要更改对应的属性(直接重写)  public $name = '四爷';  protected $country = '大清帝国';  private $wife = '甄嬛';  // 通过定义相同名字的方法来重写父类方法  public function info()  {   echo "{$this->name}的老婆是{$this->wife}";  } } // 实例化Yong类 $y = new Yong; var_dump($y); $y->info(); ``` 例子3: ``` class Kang {      public $name = '玄烨';      protected $country = '清朝';      private $wife = '赫舍里'; } class Yong extends Kang {  public function getInfo()  {       echo "{$this->name}是{$this->country}的皇帝";  }  public function getWife()  {       echo "{$this->name}的老婆是{$this->wife}";  } } // 实例化Yong类 $y = new Yong; // 调用getInfo() // $y->getInfo(); // 玄烨是清朝的皇帝 /* 子类继承了父类,可以获取父类中的公有属性和受保护的属性 子类可以继承下来私有的属性,但是可看不可摸(调用) var_dump($y);//object(Yong)#1 (3) { ["name"]=> string(6) "玄烨" ["country":protected]=> string(6) "清朝" ["wife":"Kang":private]=> string(9) "赫舍里" } $y->getWife(); // 玄烨的老婆是(报Notice错误) */ ``` 例子4:可以在父类的内部调用父类自己的私有方法 ``` class Kang {  public $name = '玄烨';  private $wife = '赫舍里';  public function getInfo()  {   echo "{$this->name}的老婆是{$this->wife}";  } } class Yong extends Kang{ } // 实例化Yong类 $y = new Yong; // getInfo()是$y(Yong)的方法,在这个方法内部,调用了父类的私有属性,可以正常输出 $y->getInfo(); ```