[关闭]
@Chiang 2020-01-08T14:12:02.000000Z 字数 1813 阅读 837

对象接口

PHP


  • 使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
  • 接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。
  • 接口中定义的所有方法都必须是公有,这是接口的特性。
  • 需要注意的是,在接口中定义一个构造方法是被允许的。在有些场景下这可能会很有用,例如用于工厂模式时。

实现(implements)

  • 要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。
  • Note:
    在 PHP 5.3.9 之前,实现多个接口时,接口中的方法不能有重名,因为这可能会有歧义。在最近的 PHP 版本中,只要这些重名的方法签名相同,这种行为就是允许的。
  • Note:
    接口也可以继承,通过使用 extends 操作符。
  • Note:
    类要实现接口,必须使用和接口中所定义的方法完全一致的方式。否则会导致致命错误。

常量

接口中也可以定义常量。接口常量和类常量的使用完全相同,但是不能被子类或子接口所覆盖。

范例

  1. <?php
  2. // 声明一个'iTemplate'接口
  3. interface iTemplate
  4. {
  5. public function setVariable($name, $var);
  6. public function getHtml($template);
  7. }
  8. // 实现接口
  9. // 下面的写法是正确的
  10. class Template implements iTemplate
  11. {
  12. private $vars = array();
  13. public function setVariable($name, $var)
  14. {
  15. $this->vars[$name] = $var;
  16. }
  17. public function getHtml($template)
  18. {
  19. foreach($this->vars as $name => $value) {
  20. $template = str_replace('{' . $name . '}', $value, $template);
  21. }
  22. return $template;
  23. }
  24. }
  25. // 下面的写法是错误的,会报错,因为没有实现 getHtml():
  26. // Fatal error: Class BadTemplate contains 1 abstract methods
  27. // and must therefore be declared abstract (iTemplate::getHtml)
  28. class BadTemplate implements iTemplate
  29. {
  30. private $vars = array();
  31. public function setVariable($name, $var)
  32. {
  33. $this->vars[$name] = $var;
  34. }
  35. }
  36. ?>

可扩充的接口

  1. <?php
  2. interface a
  3. {
  4. public function foo();
  5. }
  6. interface b extends a
  7. {
  8. public function baz(Baz $baz);
  9. }
  10. // 正确写法
  11. class c implements b
  12. {
  13. public function foo()
  14. {
  15. }
  16. public function baz(Baz $baz)
  17. {
  18. }
  19. }
  20. // 错误写法会导致一个致命错误
  21. class d implements b
  22. {
  23. public function foo()
  24. {
  25. }
  26. public function baz(Foo $foo)
  27. {
  28. }
  29. }
  30. ?>

继承多个接口

  1. <?php
  2. interface a
  3. {
  4. public function foo();
  5. }
  6. interface b
  7. {
  8. public function bar();
  9. }
  10. interface c extends a, b
  11. {
  12. public function baz();
  13. }
  14. class d implements c
  15. {
  16. public function foo()
  17. {
  18. }
  19. public function bar()
  20. {
  21. }
  22. public function baz()
  23. {
  24. }
  25. }
  26. ?>

使用接口常量

  1. <?php
  2. interface a
  3. {
  4. const b = 'Interface constant';
  5. }
  6. // 输出接口常量
  7. echo a::b;
  8. // 错误写法,因为常量不能被覆盖。接口常量的概念和类常量是一样的。
  9. class b implements a
  10. {
  11. const b = 'Class constant';
  12. }
  13. ?>

接口加上类型约束,提供了一种很好的方式来确保某个对象包含有某些方法。参见 instanceof 操作符和类型约束。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注