关于php:接口的用法

Usage of Interfaces

只是前面一个关于oo php的问题的澄清。我已经在php.net网站上查过了,但还不能完全确定。我想应该是个快速的答案。

在接口中"定义"方法时,实现它的类必须使用接口中列出的所有方法吗?

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
    }
}

这样行吗?


不可以。实现接口的类必须实现该接口定义的所有方法或定义为抽象方法。如果您尝试在未定义所有方法的情况下运行脚本,您将得到

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

换句话说,要么

1
abstract class bar implements foo {}

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

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

1
2
3
4
5
class bar implements foo {
    public function blah() { /* code */ }
    public function bleh() { /* code */ }
    public function de() {}
}


是的,也不是。您可以在一个abstract类中实现接口的一个子集。注意,您不能实例化抽象类(但它对于提供公共功能很有用)。

对于实例化的类,它们必须始终实现整个接口。这就是接口的要点,你知道如果$foo instanceof foointerface它将始终支持接口中声明的每一个方面(因此,当你执行$bar->de()时,它不会出错或做一些意想不到的事情……

接口上的文档实际上相当好。我建议你读一下……


不,不行。当你试图实例化类时,你会得到一个错误。整个接口点都指向定义的函数,这些函数必须在实现接口的InstanceSet对象中定义。但是,您可以做的是将另一个类扩展到您已经定义的类,在那里定义缺少的函数并声明这个函数。