接口
概览
一个类可以通过被称为接口的方式实现一组功能,在这里被称为契约。接口是一组方法声明和常量。请注意,方法只是声明,而不是定义;也就是说,接口定义了一个由抽象方法组成的类型,这些方法由客户端类根据需要实现。接口允许不相关的类使用相同名称和类型来实现相同的设施,而无需这些类共享一个共同的基类。
一个接口可以扩展一个或多个其他接口,在这种情况下,它会继承其基接口的所有成员。
接口声明
语法
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 | 此实例方法检索一个迭代器,该迭代器实现Iterator 或Traversable 。它在失败时抛出Exception 。 |
接口 Throwable
此类型是可通过throw语句抛出的任何对象的类型的基接口。用户编写的类不能直接实现Throwable
。相反,它必须扩展Error
或Exception
。
此类型定义如下
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;
}
接口成员定义如下
名称 | 用途 |
---|---|
__toString | string ; 以某种未指定格式检索异常的字符串表示形式 |
getCode | int ; 检索异常代码 |
getFile | string ; 检索生成异常的脚本名称 |
getLine | int ; 检索生成异常的脚本中的源代码行号 |
getMessage | string ; 检索异常消息 |
getPrevious | Throwable ; 检索之前的异常(如果存在);否则返回NULL |
getTrace | array ; 检索函数堆栈跟踪信息,作为数组 |
getTraceAsString | string ; 检索函数堆栈跟踪信息,格式化为一个未指定格式的单个字符串 |
接口 Traversable
此接口旨在作为所有可遍历类的基接口。此接口定义如下
interface Traversable
{
}
此接口没有成员。
接口 Serializable
此接口提供对自定义序列化的支持。它定义如下
interface Serializable
{
function serialize();
function unserialize ($serialized);
}
接口成员定义如下
名称 | 用途 |
---|---|
serialize | 此实例方法返回当前实例的字符串表示形式。如果失败,它将返回NULL 。 |
unserialize | 此实例方法根据$serialized 指定的字符串形式构造一个对象。它不返回值。 |