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

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、组合方式实现多重继承(表象模拟)
采用的是类内部实现对象引用技术。
<?php

class 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、接口方式实现多重继承(完全模拟)

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

<?php
interface 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);

结果如下图:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值