php arrayaccess,PHP中把对象当数组使用: ArrayAccess的实现

42bd13c6670274f0993c5c92419dc87e.png

在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方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值