php arrayaccess什么作用,php中ArrayAccess是什么?php中ArrayAccess的介绍(代码示例)...

本篇文章给大家带来的内容是关于php中ArrayAccess是什么?php中ArrayAccess的介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

php提供了6个常用的预定义接口,实现某些特定的能力。其中最最常用的就是 ArrayAccess 了,像 Laravel 这种流行的框架都用到了它。

ArrayAccess 是啥

如官方文档所述,它“提供像访问数组一样访问对象的能力的接口”。

它提供了4个接口/**

* Interface to provide accessing objects as arrays.

* @link http://php.net/manual/en/class.arrayaccess.php

*/

interface ArrayAccess {

/**

* Whether a offset exists

* @link http://php.net/manual/en/arrayaccess.offsetexists.php

* @param mixed $offset

* An offset to check for.

*

* @return boolean true on success or false on failure.

*

*

* The return value will be casted to boolean if non-boolean was returned.

* @since 5.0.0

*/

public function offsetExists($offset);

/**

* Offset to retrieve

* @link http://php.net/manual/en/arrayaccess.offsetget.php

* @param mixed $offset

* The offset to retrieve.

*

* @return mixed Can return all value types.

* @since 5.0.0

*/

public function offsetGet($offset);

/**

* Offset to set

* @link http://php.net/manual/en/arrayaccess.offsetset.php

* @param mixed $offset

* The offset to assign the value to.

*

* @param mixed $value

* The value to set.

*

* @return void

* @since 5.0.0

*/

public function offsetSet($offset, $value);

/**

* Offset to unset

* @link http://php.net/manual/en/arrayaccess.offsetunset.php

* @param mixed $offset

* The offset to unset.

*

* @return void

* @since 5.0.0

*/

public function offsetUnset($offset);

}

我们实现这4个接口,依次对应数组的isset,读取,设置,unset操作。

有什么用

定义说的很明白啦,提供像访问数组一样访问对象的能力。用上了它,可以让一个类即可以支持对象引用,也支持数组引用。

代码实现示例class Container implements ArrayAccess

{

/**

* @var array 单例对象索引

*/

private $instances = [];

/**

* @var array 可实例化对象定义索引

*/

private $definitions = [];

public function offsetExists($offset)

{

return isset($this->definitions[$offset]);

}

public function offsetGet($offset)

{

if (isset($this->instances[$offset])) {

return $this->instances[$offset];

} elseif (isset($this->definitions[$offset])) {

return $this->make($offset);

}

throw new \Exception('未提供对象定义');

}

public function offsetSet($offset, $value)

{

// ... 省略一些较验判断

$this->definitions[$offset] = $value;

}

public function offsetUnset($offset)

{

unset($this->definitions[$offset]);

unset($this->instances[$offset]);

}

private function make($offset)

{

$definition = $this->definitions[$offset];

if ($definition instanceof \Closure) {

return $this->instances[$offset] = $definition();

}

if (is_object($definition)) {

return $this->instances[$offset] = $definition;

}

if (is_array($definition)) {

$class = $definition['class'];

$reflection = new \ReflectionClass($class);

$dependencies = [];

// ... 省略反射的实现代码

$object = $reflection->newInstanceArgs($dependencies);

return $this->instances[$offset] = $object;

}

throw new \Exception('对象定义不合法');

}

}

使用示例$container = new Container();

$container['test'] = function () {

return 'this is a test';

};

var_dump(isset($container['test']));

echo $container['test'];

unset($container['test']);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值