【问题标题】:What is the meaning of abstract in interface [duplicate]接口中的抽象是什么意思[重复]
【发布时间】:2014-01-02 18:53:48
【问题描述】:

接口中的关键字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 工作正常

【问题讨论】:

  • 不需要密钥abstract,因为接口中定义的所有方法都必须在类中实现。
  • 我的问题是,如果你打开这个链接php.net/manual/en/class.arrayaccess.php 这是一个接口 ArrayAccess,其中所有方法都是抽象的,但我正在尝试编写自己的接口方法抽象我得到错误
  • 接口中的所有方法都已经是抽象方法了。您不需要隐含地告诉每个方法它是抽象的,因为它已经是默认的(我只是不知道为什么会出现错误,他们可以简单地忽略它)。

标签: php


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    接口是一个空类,它只包含方法的声明。所以任何 实现此接口的类必须包含其中声明的函数。所以, 接口不过是一个严格的规则,它有助于扩展任何类并严格 实现接口中定义的所有方法。

    当一个方法被声明为抽象时,这意味着子类必须重写它 方法。抽象方法不应包含定义它的任何主体。一个 可以如下声明抽象方法: 抽象公共函数 test();

    如果你仔细阅读上面的段落,你就会明白接口中的所有方法都是抽象的。

    我认为您很困惑,因为 abstract 关键字显示在函数之前。

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

    这里的抽象表示函数是抽象函数。

    【讨论】:

      【解决方案3】:

      接口是类的定义。它指定了实现接口所需的一些方法。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-13
        • 2019-06-22
        • 2011-07-05
        • 2014-06-02
        • 1970-01-01
        • 1970-01-01
        • 2014-08-27
        • 2012-03-05
        相关资源
        最近更新 更多