2010-08-23 86 views
2

只是从an earlier question关于OO PHP的澄清。我检查了php.net网站,但仍不完全确定。应该是一个快速的答案,我期望。接口的使用

当在接口中定义方法时,实现它的类是否必须使用全部从接口列出的方法?

例子:

interface foo { 
    public function blah(); 
    public function de(); 
    public function bleh(); 
} 

class bar implements foo { 
    public function blah() { 
     //Code here 
    } 

    public function bleh() { 
     //More code here 
    } 
} 

将这项工作?

+0

这应该可能读'功能'不'方法' – Gordon 2010-08-23 18:08:25

+0

是的,编辑的问题。感谢您指出我。 – 2010-08-23 18:12:59

回答

2

否。实施interface的类必须实现由接口定义的所有方法或定义为抽象。如果您尝试运行没有定义的所有方法的脚本,你会得到

Fatal error: Class bar contains 1 abstract method and must therefore be declared abstract or implement the remaining methods

换句话说,无论是做

abstract class bar implements foo {} 

abstract class bar implements foo { 
     public function blah() { /* code */ } 
     public function bleh() { /* code */ }  
} 

或留下一些方法在空具体类

class bar implements foo { 
    public function blah() { /* code */ } 
    public function bleh() { /* code */ } 
    public function de() {} 
} 
+1

谢谢戈登。这真的为我清除它。 – 2010-08-23 18:08:09

1

好吧,是的,不。您可以在abstract class中实现接口的子集。请注意,您不能实例化抽象类(但它对于提供常用功能很有用)。

对于实例化的类,它们必须始终实现整个接口。这就是接口的点,你知道,如果$foo instanceof foointerface它会一直支持接口中声明的各个方面(因此没有错误或者做一些意想不到的,当你做$bar->de() ...

docs on interfaces实际上相当不错,我推荐给它一个读...

0

不,它不会工作 当你尝试实例化类时,你会得到一个错误 接口的全部点是定义函数必须在实现该接口的instanciatet对象中定义。 但是,您可以做的是将另一个类扩展到c你已经定义好了,在那里定义缺失的函数,然后立即执行这个函数。