结合网上文档和官方文档,自我测试总结心得,实践出真知,时间匆忙,写的不详请谅解!

结合实例分析:

<?php

header("Content-type:text/html;charset=utf-8");

abstract class People{

protected $age=22;

public $height=1.70;

abstract function work();

//抽象方法没有方法体,子类必须实现。

function run(){}

function People() //可以定义构造函数

{

echo "人类的平均身高".$this->height."<br/>";

}

}

abstract class student extends People{

//如果子类没有全部实现抽象类中的所有抽象方法,那么该子类也是一个抽象类

abstract function student_run(){}

}

class PhpTeacher extends student implements Common{

public $height=1.75;

//子类的属性访问控制必须和父类一样甚至更宽泛

/*function PhpTeacher()

{

echo "php程序员的平均身高".$this->height."<br/>";

}*/

function work(){ //抽象方法子类必须实现

echo "教授php";

}

function getAge()

{

echo $this->age;//继承父类可以访问父类的age

}

// function run(){

// echo "会跑步";

// }

function speakEnglish(){

echo "会说英语"."<br/>";

}

function drive($height)

{

echo $height."<br/>";

}

}


interface Common{

//所有的接口方法,实现接口的类必须都得实现

function speakEnglish();

//interface 是完全抽象的,只能声明方法,而且只能声明 public 的方法,不能声明 private 及 protected 的方法,不能定义方法体,也不能声明实例变量 不能加abstract

function drive($args);

}

$phpTeacher = new PhpTeacher();

$phpTeacher ->work();

echo "<br/>";

$phpTeacher->getAge();

/*

总结:

抽象类

PHP 5 支持抽象类和抽象方法。定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。

继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。例如,子类定义了一个可选参数,而父类抽象方法的声明里没有,则两者的声明并无冲突。 这也适用于 PHP 5.4 起的构造函数。在 PHP 5.4 之前的构造函数声明可以不一样的。

抽象类的特点:

抽象类不能实例化,只能被继承。

抽象类不一定有抽象方法,有抽象方法的类,一定是抽象类。

抽象方法的可见性不能是private

抽象方法在子类中,需要重写。

什么时候需要用抽象类?

有个方法,方法体不知如何写,子类中还必须有这个方法时,封装成抽象方法,类为抽象类。

控制子类中必须封装某些方法时,可以用抽象方法。

当需要控制类只能被继承,不能被实例化时。


接口

使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。

接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。接口中定义的所有方法都必须是公有,这是接口的特性。

接口的继承(extends):

接口继承接口 interface 接口名称 extends 父接口名称

注意:类的继承是单继承(只能有一个父类),但接口的继承却是多继承,类对接口的实现也是多实现。

接口的实现(implements):

类实现接口 class 类名 implements 接口名称1,接口名称2, ...

继承类同时实现接口:

类继承父类同时实现接口 class 类名 extends 父类名 implements 接口名称


抽象类和接口的区别

接口是一种特殊的抽象类,接口中只包含抽象方法,没有成员属性。

类实现(implements)接口时,必须完全实现接口中的所有方法;类继承(extends)抽象类时,只需对需要用到的抽象方法进行重写。

抽象类只能单继承,但接口却是多继承,类对接口的实现也是多实现。

*/

?>

参考链接:http://php.net/manual/zh/language.oop5.abstract.phphttp://php.net/manual/zh/language.oop5.interfaces.phphttp://www.jb51.net/article/47485.htmhttp://blog.csdn.net/lamp_yang_3533/article/details/50830214