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

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

结合实例分析:

<?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
时间: 2024-08-09 03:57:46

php面向对象之抽象类和接口理解的相关文章

013_面向对象_抽象类和接口

1.抽象类(abstract) (1)特点 ①方法只有声明没有实现时,该方法就是抽象方法,抽象方法必须定义到抽象类中,该类也必须被abstract修饰 ②抽象类不可以被实例化,因为调用抽象方法没有意义. ③抽象类必须有子类覆盖所有的抽象方法,该子类才可以实例化,否则,这个子类还是抽象类 (2)常见问题 ①抽象类中有构造函数吗? 有,用来给子类对象初始化 ②抽象类可以不定义抽象方法吗? 可以.目的是不让该类创建对象,通常这个类中的方法有方法体,却没有内容 ③抽象关键字不可以和哪些关键字共存? pr

Java面向对象之抽象类,接口

抽象类: 含有抽象方法的类被声明为抽象类 抽象方法由子类去实现 含有抽象方法的类必须被声明为抽象类 抽象类被子类继承,子类(如果不是抽象类)必须重写抽象类中的所有抽象方法 抽象方法: 声明而未被实现的方法 抽象类不能被实例化 子类实现不了, 由下一级子类去实现, 当前类声明为抽象类, 继承的这个方法声明为抽象方法 抽象方法的权限修饰符必须为public abstract //人类 public class Person { private String name; //自定义属性 引用类型 宠物

黑马程序员_面向对象之抽象类与接口

抽象类(abstract)???? 当编写一个类时,时常会为该类定义一些方法,这些方法的使用用以描述该类的行为方式,那么这些方法都有具体的方法体.但是在某些情况下,某个父类只是知道子类应该包含怎样的放过,但是无法精确的知道这些子类是如何实现这些方法,例如定义一个GetTime类,该类提供了一个计算某一段程序运行时间的gettime方法,但是无法知道具体运行什么方法体,这时就需要使用抽象方法来实现了. 抽象类概念 当多个类中出现相同功能,但是功能主体不同,这时候可以进行向上抽取,只抽取功能定义,而

面向对象,抽象类。接口。类库

抽象与接口,库类的使用 抽象类:抽象类,只为继承而出现,不定义具体的内容,只规定该有哪些东西:一般抽象类中只放置抽象方法,只规定了返回类型和参数:比如: 人 - 有吃饭,睡觉方法: 男人 - 继承人抽象类,必须实现吃饭,睡觉的方法主体: 女人 - 继承人抽象类,必须吃饭,睡觉方法的主体: 抽象类中可以有普通属性,通过子类来使用: 1.关键字:abstract 2.抽象类可以包含抽象方法和普通方法3.abstract关键字可以定义方法为抽象方法,抽象方法可以没有函数体4.抽象类无法被实例化,抽象类

【代码学习】PHP面向对象之抽象类与接口

一.什么是抽象方法? 一个方法如果没有方法体(不使用"{}",直接使用分号结束的方法,才是没有方法体的方法),则这个方法就是抽象方法 1.声明一个方法,不使用{},而直接分号结束 2.如果是抽象方法,必须使用abstract(抽象关键字来修饰) 二.什么是抽象类 1.如果一个类中有一个方法是抽象的方法,则这个类就是抽象类 2.如果声明一个抽象类,则这个类必须使用abstract关键字修饰 <?php //声明一个抽象类,要使用abstract关键字识别 abstract clas

java普通类、抽象类、接口、面向对象理解

1.面向对象编程: 面向对象编程的语言不止java一种,还有: simula 67(第一个面向对象语言,支持单继承和一定含义的多态和部分动态绑定): Smalltalk(第一个支持动态类型的语言,支持单继承.多态和动态绑定): EIFFEL(支持多继承.多态和动态绑定): C++(它的大部分基于类的特性继承自Simula.支持多继承.多态和部分动态绑定): C#(也支持单继承,与Java和C++等有很多类似之处): Python( [?pa?θ?n]是一种解释型.面向对象.动态数据类型的高级程序

面向对象基础之抽象类与接口 下

在上篇博文中我们一起了解了抽象类,那么什么是接口呢?下面给大家简单介绍一下: 所谓接口,就是把隐式公共方法和属性组合起来,以封装特定功能的一个集合.一旦类实现了接口,类就可以支持接口所指定的所有属性和成员.声明接口在语法上与声明抽象类完全相同,但不允许提供接口中任何成员的执行方式,因此接口不能实例化,不能有构造方法和字段,不能有修饰符,如public等.在实现接口的类中必须实现接口中的所有方法和属性. 一个接口可以支持多个接口,多个类也可以支持相同的接口.需要注意的是,接口用interface关

面向对象设计中抽象类与接口的区别

在OOD(面向对象设计)中,经常会用到抽象类或接口,[注:在C++中,没有接口的概念,只有抽象类:而在Java中两者都存在].而在使用过程中,也许会有不少人认为接口和抽象类差不多,然后就想当然地觉得可以相互完全替换.事实上,虽然他们有很多相似点,但也有很大差异. 1.抽象类与接口的出现条件 在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样.并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类.抽象类往往用来表征我们

java面向对象编程(八)--抽象类、接口

1.抽象类 1.1抽象类概念 当父类的一些方法不能确定时,可以用abstract关键字来修饰该方法[抽象方法],用abstract来修饰该类[抽象类]. //抽象类的必要性[Demo124.java] public class Demo124 { public static void main(String[] args) { //Animal an=new Animal();抽象类不允许实例化 Animal an=new Cat(); an.cry(); an=new Dog(); an.cr