抽象方法与抽象类

当类里面有一个方法是没有方法体,也就是没有花括号{},直接以分号结束。这样的方法叫做抽象方法,必须用关键字 abstract 来定义。
例如:public abstract function fn();
包含这种方法的类必须是抽象类,也要使用关键字 abstract 来声明。

抽象类的特点:

  1. - 不能实例化,不能通过new来生成对象。
  2. - 要想使用抽象类,必须定义一个类去继承这个抽象类。并定义覆盖父类的抽象方法(实现抽象方法)

接口技术

PHP与大多编程语言一样,不支持多重继承。一个子类只能继承一个父类,为了解决这个问题。PHP引入了接口技术。接口的思想是指定了一个实现了该接口的类必须实现的一系列函数。

定义格式

interface 接口名称 {
// 常量成员(const关键字定义)
// 抽象方法(不需要使用abstract)
}

使用格式

class 类名 implements 接口名1,接口名2…
{
// code
}

接口与抽象类的区别

关注事物本质抽象类;关注一个操作接口
接口是对动作的抽象,表示这个对象能做什么,对类的局部行为进行抽象。
抽象类是对根源的抽象,表示这个类是什么,对类的整体进行抽象,对一类事物的描述抽象。
比如,男人、女人这两个类,他们的抽象就是人类。人类是可以吃东西的,可以把吃东西定义成一个接口,然后让这些类去实现它。
在高级语言中,一个类只能继承一个类(抽象类)。就像人不能是生物,又是非生物。但是可以实现多个动作(接口),比如吃饭动作,走路动作等。这些动作就是接口。

  • 接口是抽象类的变体,接口中所有的方法都是抽象的。而抽象类是声明方法的存在而不去实现它的类。
  • 接口可以多继承,抽象类不行。
  • 接口定义方法,不能实现,而抽象类可以实现部分方法。
  • 接口中基本数据类型为 static(静态的),而抽象类不是。
  • 接口中不能含有静态代码块及静态方法,而抽象类可以含有静态方法及静态代码块。

也就是说接口比较纯粹,什么都不干。抽象类呢就是把一些公有的、抽象度非常高的东西放到对应的抽象里。

抽象类


  1. <?php
  2. /**
  3. * 1.含有抽象方法的类必须是抽象类
  4. * 2.抽象类不一定非得含有抽象方法
  5. * 3.抽象类可以存在普通方法
  6. * 4.抽象类不能被实例化 必须由一个子类去继承,并且把抽象类的抽象方法都实现了
  7. */
  8. abstract class Person
  9. {
  10. // 抽象方法
  11. abstract public function eat();
  12. }
  13. class Man extends Person
  14. {
  15. public function eat()
  16. {
  17. echo "eat food";
  18. }
  19. }
  20. $man = new Man();
  21. $man->eat();

上面代码会输出 eat food。

接口


  1. <?php
  2. /**
  3. * 1.接口声明的关键字 interface
  4. * 2.接口可以声明常量也可以抽象方法
  5. * 3.接口中的方法都是抽象方法 必须实现 不需要abstract定义
  6. * 4.接口也不能被实例化,需要一个类去实现它
  7. * 5.一个类不多继承多个类,但是一个类可以实现多个接口
  8. */
  9. interface Person
  10. {
  11. const NAME = "人";
  12. public function run();
  13. public function eat();
  14. }
  15. interface Study
  16. {
  17. public function study();
  18. }
  19. class Student implements Person, Study
  20. {
  21. public function run()
  22. {
  23. echo "runing";
  24. }
  25. public function eat()
  26. {
  27. echo "eat food";
  28. }
  29. public function study()
  30. {
  31. echo "study english";
  32. }
  33. public function test()
  34. {
  35. echo self::data;
  36. }
  37. public static function sti()
  38. {
  39. echo "我是静态的方法";
  40. }
  41. }
  42. $son = new Student();
  43. $son->eat();
  44. echo $son::NAME;
  45. $son->test(); // 或者 echo Student::data;
  46. echo Student::sti();

上面代码就会输出 eat food、人、3.14、我是静态的方法。通过双冒号访问静态的属性和方法。在类里面用self访问自己。