接口

概览

一个类可以通过被称为接口的方式实现一组功能,在这里被称为契约接口是一组方法声明和常量。请注意,方法只是声明,而不是定义;也就是说,接口定义了一个由抽象方法组成的类型,这些方法由客户端类根据需要实现。接口允许不相关的类使用相同名称和类型来实现相同的设施,而无需这些类共享一个共同的基类。

一个接口可以扩展一个或多个其他接口,在这种情况下,它会继承其基接口的所有成员。

接口声明

语法

interface-declaration:
   interface   name   interface-base-clauseopt   {   interface-member-declarationsopt   }

interface-base-clause:
   extends   qualified-name
   interface-base-clause   ,   qualified-name

约束

接口不能直接或间接从自身派生。

每个限定名称必须命名一个接口类型。

语义

一个接口声明定义了一个契约,一个或多个类可以实现该契约。

接口名称不区分大小写。

可选的接口基类指定了被定义接口派生自的基接口。在这种情况下,派生接口继承了基接口的所有成员。

示例

interface MyCollection
{
  const MAX_NUMBER_ITEMS = 1000;
  function put($item);
  function get();
}
class MyList implements MyCollection
{
  public function put($item)  { /* implement method */ }
  public function get()   { /* implement method */ }
  ...
}
class MyQueue implements MyCollection
{
  public function put($item)  { /* implement method */ }
  public function get()   { /* implement method */ }
  ...
}
function processCollection(MyCollection $p1)
{
  ... /* can process any object whose class implements MyCollection */
}
processCollection(new MyList(...));
processCollection(new MyQueue(...));

接口成员

语法

interface-member-declarations:
   interface-member-declaration
   interface-member-declarations   interface-member-declaration

interface-member-declaration:
   class-const-declaration
   method-declaration

语义

接口的成员是其接口成员声明中指定的成员,以及从其基接口继承的成员。

接口可以包含以下成员

  • 常量 - 与接口关联的常量值。
  • 方法 - 用于实现接口的计算和操作的占位符。

常量

约束

接口中声明的所有常量必须是隐式或显式公共的。

语义

接口常量就像类常量一样,只是接口常量不能被实现它的类或扩展它的接口覆盖。

示例

interface MyCollection
{
  const MAX_NUMBER_ITEMS = 1000;
  function put($item);
  function get();
}

方法

约束

接口中声明的所有方法必须是隐式或显式公共的,并且不能被声明为abstract

语义

接口方法就像抽象方法一样。

示例

interface MyCollection
{
  const MAX_NUMBER_ITEMS = 1000;
  function put($item);
  function get();
}

预定义接口

接口 ArrayAccess

此接口允许使用数组样式的符号访问实现类的实例。此接口定义如下

interface ArrayAccess
{
  function offsetExists($offset);
  function offsetGet($offset);
  function offsetSet($offset, $value);
  function offsetUnset($offset);
}

接口成员定义如下

名称用途
offsetExists此实例方法如果实例包含键为$offset的元素,则返回TRUE,否则返回FALSE
offsetGet此实例方法获取具有键$offset的值。它可以按值或按引用返回。 (通常,这将不被允许,因为实现接口的类需要匹配接口的方法签名;但是,引擎对ArrayAccess进行了特殊处理,并允许这样做)。当实现此接口的类的实例在非左值上下文中被下标时,会调用此方法。
offsetSet此实例方法将具有键$offset的值设置为$value。它不返回值。当实现此接口的类的实例在可修改的左值上下文中被下标时,会调用此方法。
offsetUnset此实例方法取消设置具有键$offset的值。它不返回值。

接口 Iterator

此接口允许实现类的实例被视为集合。此接口定义如下

interface Iterator extends Traversable
{
  function current();
  function key();
  function next();
  function rewind();
  function valid();
}

接口成员定义如下

名称用途
current此实例方法返回当前位置的元素。
key此实例方法返回当前元素的键。如果失败,它将返回NULL;否则,它将返回键的标量值。
next此实例方法将当前位置向前移动到下一个元素。它不返回值。在foreach语句中,此方法在每次循环后被调用。
rewind此实例方法将当前位置重置为第一个元素。它不返回值。在foreach语句中,此方法在开始时被调用一次。
valid此实例方法检查当前位置是否有效。它不接受任何参数。它返回一个布尔值TRUE表示当前位置有效;FALSE表示无效。此方法在每次调用Iterator::rewind()Iterator::next()之后被调用。

接口 IteratorAggregate

此接口允许创建外部迭代器。此接口定义如下

interface IteratorAggregate extends Traversable
{
  function getIterator();
}

接口成员定义如下

名称用途
getIterator此实例方法检索一个迭代器,该迭代器实现IteratorTraversable。它在失败时抛出Exception

接口 Throwable

此类型是可通过throw语句抛出的任何对象的类型的基接口。用户编写的类不能直接实现Throwable。相反,它必须扩展ErrorException

此类型定义如下

interface Throwable {
  function __toString(): string;
  function getCode(): int;
  function getFile(): string;
  function getLine(): int;
  function getMessage(): string;
  function getPrevious(): Throwable;
  function getTrace(): array;
  function getTraceAsString(): string;
}

接口成员定义如下

名称用途
__toStringstring; 以某种未指定格式检索异常的字符串表示形式
getCodeint; 检索异常代码
getFilestring; 检索生成异常的脚本名称
getLineint; 检索生成异常的脚本中的源代码行号
getMessagestring; 检索异常消息
getPreviousThrowable; 检索之前的异常(如果存在);否则返回NULL
getTracearray; 检索函数堆栈跟踪信息,作为数组
getTraceAsStringstring; 检索函数堆栈跟踪信息,格式化为一个未指定格式的单个字符串

接口 Traversable

此接口旨在作为所有可遍历类的基接口。此接口定义如下

interface Traversable
{
}

此接口没有成员。

接口 Serializable

此接口提供对自定义序列化的支持。它定义如下

interface Serializable
{
  function serialize();
  function unserialize ($serialized);

}

接口成员定义如下

名称用途
serialize此实例方法返回当前实例的字符串表示形式。如果失败,它将返回NULL
unserialize此实例方法根据$serialized指定的字符串形式构造一个对象。它不返回值。