代码之家  ›  专栏  ›  技术社区  ›  Saladin Akara

接口的使用

  •  2
  • Saladin Akara  · 技术社区  · 14 年前

    只是澄清一下 an earlier question 关于OO PHP。我已经在php.net网站上查过了,但还不能完全确定。我想应该是个快速的答案。

    在接口中“defining”方法时,实现它的类必须使用 全部的 接口中列出的方法?

    例子:

    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
        }
    }
    

    这样行吗?

    3 回复  |  直到 14 年前
        1
  •  2
  •   Gordon Haim Evgi    14 年前

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

    致命错误:类栏包含1个抽象方法,因此必须声明为抽象方法或实现其余方法

    换句话说,要么

    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() {}
    }
    
        2
  •  1
  •   ircmaxell    14 年前

    是和否。您可以在 abstract class . 注意,您不能实例化抽象类(但它对于提供公共功能很有用)。

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

    这个 docs on interfaces 其实还不错。我建议你读一下……

        3
  •  0
  •   The Surrican    14 年前

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