本篇文章给大家带来的内容是关于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 <p> * an offset to check for. * </p> * @return boolean true on success or false on failure. * </p> * <p> * 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 <p> * the offset to retrieve. * </p> * @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 <p> * the offset to assign the value to. * </p> * @param mixed $value <p> * the value to set. * </p> * @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 <p> * the offset to unset. * </p> * @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']);
以上就是php中arrayaccess是什么?php中arrayaccess的介绍(代码示例)的详细内容。