+ -
当前位置:首页 → 问答吧 → 讨论PHP的interface有什么用?

讨论PHP的interface有什么用?

时间:2010-07-22

来源:互联网

我知道在强类型的语言中,interface可以实现多态的特性,但PHP本身是个弱类型语言,那interface这个关键字有什么用?
比如在Java里的代码:
  1. // 接口定义
  2. public interface sayHello {
  3.     void sayHello(String name);
  4. }

  5. // 两个实现sayHello接口的类
  6. public class Boy implements sayHello {
  7.     public void sayHello(String name) {
  8.         System.out.println("I'm a boy. Hello " + name + ".");
  9.     }
  10. }

  11. class Girl implements sayHello {
  12.     public void sayHello(String name) {
  13.         System.out.println("I'm a girl. Hello " + name + ".");
  14.     }
  15. }

  16. // 主程序
  17. public class Main {
  18.     public static void main(String[] args) {
  19.         Boy boy = new Boy();
  20.         Girl girl = new Girl();
  21.         say(boy);
  22.         say(girl);
  23.     }
  24.     public static void say(sayHello p) {
  25.         p.sayHello("Woody");
  26.     }
  27. }
复制代码


Java里通过接口统一了不同类的调用方式,但PHP完全可以不用 interface 来实现同样的功能:

class Boy {
    function sayHello($name) {
        echo "I'm a boy. Hello $name!\n";
    }
}

class Girl {
    function sayHello($name) {
        echo "I'm a girl. Hello $name!\n";
    }
}

function say($p) {
    $p->sayHello("Woody");
}

$boy = new Boy();
$girl = new Girl();
say($boy);
say($girl);

如此看来,interface这个关键字就是多余了?

作者: ggggqqqqihc   发布时间: 2010-07-22



其实对于弱类型的动态语言来说interface没有太大作用,动态语言依赖duck typing就能很好地面对接口编程了。

如果硬要说作用的话:
1、起到规范代码的作用。比如某模块需要依赖一个接口,对于动态语言,直接传递对象也是可以的,但是有时候开发者会在实现这个类时忘记实现某个必需的方法,所以模块在调用这个对象方法时为了避免运行时错误,需要用method_exists进行检查,那么这时就可以要求传递的类必须是指定interface的实现,只要用instanceof检查通过,就可以放心地调用这个对象的方法了。

2、RTTI运行时对象类型识别。有时程序需要根据传递的对象类型来进行进一步的处理,一般的做法是get_class、instanceof等判断对象类名或继承关系来进行对象类型识别,但有时候某个对象可能会“身兼数职”,拥有多个身份,那么这时候就可以用interface了,因为interface是可以多重继承的,此时接口的作用仅仅是给对象打上标记而已。

作者: 四不象   发布时间: 2010-07-22