Blogger Information
Blog 36
fans 0
comment 0
visits 27931
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
类的继承、抽象类、接口
小程_武汉_214945
Original
748 people have browsed it

访问权限

序号 名称 关键字 类外部 类内部 类继承上下文 描述
1 公开成员 public 允许 允许 允许 默认
2 受保护成员 protected 禁止 允许 允许 封装
3 私有成员 private 禁止 允许 禁止 封装

继承的三大功能

  • 继承:继承基类的成员
  • 重写:覆写基类中的成员
  • 扩展:子类中添加新的方法

继承示例

  1. <?php
  2. class A{
  3. public $a=1;
  4. protected $b=2;
  5. protected $c=3;
  6. public function get(){
  7. return sprintf('a=%d,b=%d, c=%d',$this->a,$this->b,$this->c);
  8. }
  9. }
  10. class B extends A{
  11. }
  12. $b=new B;
  13. echo $b->get();
  14. //结果为
  15. //a=1,b=2, c=3
  1. <?php
  2. class A{
  3. public $a=1;
  4. protected $b=2;
  5. //将c改为私有属性
  6. private $c=3;
  7. }
  8. class B extends A{
  9. //尝试在子类访问私有属性
  10. public function get(){
  11. return sprintf('a=%d,b=%d, c=%d',$this->a,$this->b,$this->c);
  12. }
  13. }
  14. $b=new B;
  15. echo $b->get();
  16. //结果为
  17. //a=1,b=2, c=0
  18. //子类不能调用继承自父类的私有属性

重写演示

  1. <?php
  2. class A{
  3. public $a=1;
  4. protected $b=2;
  5. protected $c=3;
  6. public function get(){
  7. return sprintf('a=%d,b=%d, c=%d',$this->a,$this->b,$this->c);
  8. }
  9. }
  10. class B extends A{
  11. //重写父类中的属性
  12. public $a=100;
  13. //重写父类的方法
  14. public function get(){
  15. return sprintf('子类中a=%d,b=%d, c=%d',$this->a,$this->b,$this->c);
  16. }
  17. }
  18. $b=new B;
  19. echo $b->get();
  20. //结果为
  21. //子类中a=100,b=2, c=3

扩展演示

  1. <?php
  2. class A{
  3. public $a=1;
  4. protected $b=2;
  5. protected $c=3;
  6. public function get(){
  7. return sprintf('a=%d,b=%d, c=%d',$this->a,$this->b,$this->c);
  8. }
  9. }
  10. class B extends A{
  11. // 属性扩展
  12. public $d=4;
  13. //方法重写
  14. public function get(){
  15. return parent::get().sprintf('c=%d',$this->d);
  16. }
  17. //方法扩展
  18. public function add(){
  19. return 'a+b+c+d='.($this->a+$this->b+$this->c+$this->d);
  20. }
  21. }
  22. $b=new B;
  23. echo $b->get(),'<br>';
  24. echo $b->add();
  25. //结果为
  26. //a=1,b=2, c=3c=4
  27. //a+b+c+d=10

抽象类

  • 抽象类不能被实例化

  • 任何类里含有抽象方法都必须声明为抽象类

  • 抽象类只能在实现了抽象方法之后才能被实例化

  • 抽象类部分分离了设计与现实

  1. <?php
  2. abstract class Stu{
  3. public $name;
  4. public $school='实验小学';
  5. const NATION ='中国' ;
  6. public function out(){
  7. return "{$this->name}来自{$this->school}";
  8. }
  9. abstract public function from();
  10. }
  11. class Stu1 extends Stu{
  12. public $name='小明';
  13. public function from(){
  14. return $this->name.'出生于'.Stu::NATION;
  15. }
  16. }
  17. $stu=new Stu1;
  18. echo $stu->out(),'<br>';
  19. echo $stu->from();
  20. //结果
  21. // 小明来自实验小学
  22. // 小明出生于中国

接口

  • 接口实现了设计与分离

  • 接口内只能包含常量和方法的定义

  • 接口中定义的所有方法都必须是公有

  • 可以用接口实现多继承

  • 接口使用 implements 实现

接口演示

  1. <?php
  2. interface Stu1{
  3. const NAME='小明';
  4. public function from();
  5. }
  6. interface Stu2{
  7. public function out();
  8. }
  9. class Stu implements Stu1,Stu2{
  10. public $school='实验小学';
  11. const NATION ='中国' ;
  12. public function out(){
  13. return Stu1::NAME."来自{$this->school}";
  14. }
  15. public function from(){
  16. return Stu1::NAME.'出生于'.self::NATION;
  17. }
  18. }
  19. $stu=new Stu;
  20. echo $stu->out(),'<br>';
  21. echo $stu->from();
  22. //运行结果
  23. // 小明来自实验小学
  24. // 小明出生于中国

总结:总的来说继承是一种减少代码冗余的手段,抽象类和接口类都是为了实现将设计与实现分离,其中接口类实现了 php 的多继承

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:继承就是为了代码复用,类似的还有trait
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post