您的位置:首页 > 编程语言 > PHP开发

php面向对象之抽象类和接口理解

2017-09-22 18:56 316 查看
结合网上文档和官方文档,自我测试总结心得,实践出真知,时间匆忙,写的不详请谅解!
结合实例分析:
<?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.php http://php.net/manual/zh/language.oop5.interfaces.php http://www.jb51.net/article/47485.htm http://blog.csdn.net/lamp_yang_3533/article/details/50830214
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息