接口中abstract的含义是什么?

时间:2014-01-02 18:53:49

标签: php

interface中关键字abstract的含义是什么? 我正在尝试在界面中编写抽象关键字。

<?php
interface I
{
     abstract  function test ();
}

class A implements I{
    public function test ($offset)
    {

    }    
}
$x=new A();

?>

获取错误:

Fatal error: Access type for interface method I::test() must be omitted in test.php on line 4

但是这里所有的方法都是抽象的http://www.php.net/manual/en/class.arrayaccess.php,我已经实现了这个工作正常。

错误的原因是什么,因为它适用于预定义接口ArrayAccess

3 个答案:

答案 0 :(得分:2)

来自php.net (http://www.php.net/manual/en/language.oop5.abstract.php

“PHP 5引入了抽象类和方法。定义为抽象的类可能无法实例化,任何包含至少一个抽象方法的类也必须是抽象的。定义为抽象的方法只是声明方法的签名 - 他们无法定义实现。“

答案 1 :(得分:1)

接口是一个空类,只包含方法的声明。所以 实现此接口的类必须包含声明的函数。所以, 界面只是一个严格的裁决,这有助于扩展任何类和严格 实现接口中定义的所有方法。

当一个方法声明为abstract时,意味着子类必须覆盖它 方法。抽象方法不应包含定义它的任何主体。一个 abstract方法可以声明如下: abstract public function test();

如果您仔细阅读上面的段落,那么您可以理解界面中的所有方法都是抽象的。

我认为你很困惑因为抽象关键字在功能之前显示。

ArrayAccess {
    /* Methods */
    abstract public boolean offsetExists ( mixed $offset )
    abstract public mixed offsetGet ( mixed $offset )
    abstract public void offsetSet ( mixed $offset , mixed $value )
    abstract public void offsetUnset ( mixed $offset )
   }

这里抽象显示函数是抽象函数。

答案 2 :(得分:0)

接口是类的定义。它指定了为实现接口而需要存在的一些方法。

抽象是您扩展的接口和父类的组合。它有一些方法你必须像接口一样实现,但也有一些定义的方法。

要使代码生效,您需要从方法中删除abstract关键字,或者将类定义更改为抽象,而不是接口。在这两种情况下,您还需要更改test方法的签名以匹配实现类中的定义(添加$ offset参数)。