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、组合方式实现多重继承(表象模拟)
采用的是类内部实现对象引用技术。
4-2、接口方式实现多重继承(完全模拟)
结果如下图:
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);
结果如下图: