在PHP的预定义接口和方法中, 有一个ArrayAccess(数组式访问)接口。
定义: 像访问数组一样访问对象的能力的接口
interface ArrayAccess {
public function offsetExists ( mixed $offset ) : bool
public function offsetGet ( mixed $offset ) : mixed
public function offsetSet ( mixed $offset , mixed $value ) : void
public function offsetUnset ( mixed $offset ) : void
}
举一个简单的例子, 用Foo类去实现该接口中的4个方法:
class Foo implements ArrayAccess{
public function offsetExists($offset){//isset判断时调用
echo "这里是 offsetExists() 方法 你输入的参数是 {$offset}".PHP_EOL;
}
public function offsetGet($offset){//获取值时调用
echo "这里是 offsetGet() 方法 你输入的参数是 $offset".PHP_EOL;
}
public function offsetSet($offset, $value){//设置值时调用
echo "这里是 offsetSet() 方法 你输入的 {$offset}={$value}".PHP_EOL;
}
public function offsetUnset($offset){//unset时调用
echo "这里是 offsetUnset() 方法 你输入的参数是 {$offset}".PHP_EOL;
}
}
接口就是一个类的模板, 在其实现类中必须实现所有的方法,否则直接"Fatal error"。我们上面就给类Foo实现了ArrayAccess的4种方法,现在来调用下试试。
$foo = new Foo();
var_dump(isset($foo["name"]));
echo $foo["name"];
$foo["name"] = "aben";
unset($foo["name"] );
运行结果是:
这里是 offsetExists() 方法 你输入的参数是 name
bool(false)
这里是 offsetGet() 方法 你输入的参数是 name
这里是 offsetSet() 方法 你输入的 name=aben
这里是 offsetUnset() 方法 你输入的参数是 name
在实际的工作中,最常用到ArrayAccess的就属ORM获取数据操作了。
下面是tp5.1中数据集Collection类的代码摘要
/**
* 数据集管理类
*/
class Collection implements ArrayAccess, Countable, IteratorAggregate, JsonSerializable, Arrayable, Jsonable
{
....
// ArrayAccess
public function offsetExists($offset)
{
return array_key_exists($offset, $this->items);
}
public function offsetGet($offset)
{
return $this->items[$offset];
}
public function offsetSet($offset, $value)
{
if (is_null($offset)) {
$this->items[] = $value;
} else {
$this->items[$offset] = $value;
}
}
public function offsetUnset($offset)
{
unset($this->items[$offset]);
}
...
}
该类中实现了ArrayAccess的4种操作, 以及Countable实现数组的count方法。