php面向对象视频笔记之第四章(接口与多态)

来源:互联网 发布:国际城市三字代码 数据 编辑:程序博客网 时间:2024/05/24 05:03
1、接口的定义与规范
1-1、php与大多数面向对象编程语言一样,不支持多重继承,也就是说每个类只能继承一个父类。
为了解决这个问题,php引入了接口,接口的思想是指定了一个实现了该接口的类必须实现的一系列方法。
1-2、定义:接口(interface)是抽象方法和静态常量(const)定义的集合;在php中,声明接口语法类似声明类,
只不过使用关键词interface,interface 接口名 {...}
1-3、规范:接口是一种特殊的抽象类,这种抽象类中只包含抽象方法和静态常量;在接口中的抽象方
法只能是public的,默认也是public权限;abstract和final修饰符也不能修饰接口中的抽象方法。
2、接口的实现与继承
2-1、使用implements来实现一个接口。
         class 类名 implements 接口名{ 实现接口的抽象方法... }
2-2、一个类可以实现多个接口。只要使用逗号(,)将多个接口链接起来就可以。
        class 类名 implements 接口名1,接口名2,...{ 实现接口的抽象方法... }
2-3、一个类可以继承类并实现接口。
       class 子类名 extends 父类名 implements 接口名{ 自己的属性方法;接口抽象方法的具体实现;... }
2-4、一个接口可以继承自另外的接口。注意只有接口和接口之间使用继承关键字extends。
2-5、一个接口继承其它接口时,直接继承父接口的静态常量属性和抽象方法。
2-6、类实现接口必须实现其抽象方法,使用实现关键字implements。
2-7、php中的类是单继承,但是接口很特殊。一个接口可以继承自多个接口。
2-8、抽象类(abstract class)实现接口,可以不实现其中的抽象方法,而将抽象方法的实现交付给具体能被实例化的类去处理 。
3、面向对象编程三大特性之多态
3-1、多态的概念
多态按字面上意思就是“多种形状”。可以理解为多种表现形式,即“一个对外接口(方法),多个内部实现”。
在面向对象的理论中,多态性的一般定义为:同一个操作(函数)作用于不同的类的实例,将产生不同的执行结果。
也即不同类的对象收到相同的信息时,将得到不同的结果。(由继承或接口[建议]来实现)
4、php实现多重继承
4-1、组合方式实现多重继承(表象模拟)
采用的是类内部实现对象引用技术。
<?phpclass student{  private $name = 'yi';  function getName(){     echo 'student name is '.$this->name,'<br />';  }}class teacher{   private $work_year = 2;//工龄   function getWorkYear(){      echo 'teacher work year is '.$this->work_year,'<br />';   }}//研究生class graduate extends student{   private $teacher;   public function __construct(){      $this->teacher = new teacher();   }   function getWorkYear(){      $this->teacher->getWorkYear();   }}class test{   static function getName(student $stu){      $stu->getName();   }   static function getWorkYear(teacher $teacher){      $teacher->getWorkYear();   }}$yi = new graduate();$yi->getName();$yi->getWorkYear();echo '<hr />';test::getName($yi);test::getWorkYear($yi);//没完全继承

结果如下图:



4-2、接口方式实现多重继承(完全模拟)

通过把类的特征抽象为接口,并通过实现接口的方式让对象有多重身份,自然就可以完全模拟多重继承了。

<?phpinterface user{   function getName();}interface teacher{   function getWorkYear();}class student implements user{   private $name = 'yi';   function getName(){      echo 'student name is '.$this->name,'<br />';   }}class graduateTeacher implements teacher{   private $work_year = 2;   function getWorkYear(){      echo 'teacher work year is '.$this->work_year,'<br />';   }}class graduate extends student implements teacher{   private $teacher;   public function __construct(){      $this->teacher = new graduateTeacher();   }   function getWorkYear(){      $this->teacher->getWorkYear();   }}class test{//user是接口名   static function getName(user $stu){      $stu->getName();   }    //teacher是接口名   static function getWorkYear(teacher $teacher){      $teacher->getWorkYear();   }}$yi = new graduate();$yi->getName();$yi->getWorkYear();echo '<hr />';test::getName($yi);test::getWorkYear($yi);

结果如下图:


0 0