当前位置: 首页 > 后端技术 > PHP

【PHP高级功能】ArrayAccess接口

时间:2023-03-30 06:06:12 PHP

php提供了6个常用的预定义接口来实现某些特定的功能。最常用的是ArrayAccess,Laravel等流行框架都使用它。ArrayAccess是什么正如官方文档所述,它“提供了一个接口,能够像访问数组一样访问对象”。它提供了4个接口/***提供访问对象作为数组的接口。*@linkhttp://php.net/manual/en/class.arrayaccess.php*/interfaceArrayAccess{/***偏移量是否存在*@linkhttp://php.net/manual/en/arrayaccess.offsetexists.php*@parammixed$offset

*要检查的偏移量。*

*@returnboolean成功时为真,失败时为假。*

*

*如果返回非布尔值,则返回值将转换为布尔值。*@since5.0.0*/publicfunctionoffsetExists($offset);/***要检索的偏移量*@linkhttp://php.net/manual/en/arrayaccess.offsetget.php*@parammixed$offset

*要检索的偏移量。*

*@returnmixed可以返回所有的值类型。*@since5.0.0*/publicfunctionoffsetGet($offset);/***要设置的偏移量*@linkhttp://php.net/manual/en/arrayaccess.offsetset.php*@parammixed$offset

*赋值的偏移量。*

*@parammixed$value

*要设置的值。*

*@returnvoid*@since5.0.0*/publicfunctionoffsetSet($offset,$value);/***要取消设置的偏移量*@linkhttp://php.net/manual/en/arrayaccess.offsetunset.php*@parammixed$offset

*要取消设置的偏移量。*

*@returnvoid*@since5.0.0*/publicfunctionoffsetUnset($offset);}我们实现了这4个接口,分别对应数组的isset,read,set,unset的定义是什么操作非常清晰,提供了像访问数组一样访问对象的能力。有了它,一个类可以同时支持对象引用和数组引用。代码实现示例classContainerimplementsArrayAccess{/***@vararraysingletonobjectindex*/private$instances=[];/***@vararray可实例化对象定义索引*/private$definitions=[];公共函数offsetExists($offset){returnisset($this->definitions[$offset]);}publicfunctionoffsetGet($offset){if(isset($this->instances[$offset])){return$this->instances[$offset];}elseif(isset($this->definitions[$offset])){return$this->make($offset);}thrownew\Exception('未提供对象定义');}publicfunctionoffsetSet($offset,$value){//...省略一些比较判断$this->definitions[$offset]=$value;}publicfunctionoffsetUnset($offset){unset($this->definitions[$offset]);取消设置($this->实例[$offset]);}privatefunctionmake($offset){$definition=$this->definitions[$offset];如果($定义itioninstanceof\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);返回$this->instances[$offset]=$object;}thrownew\Exception('对象定义无效');}}示例$container=newContainer();$container['test']=function(){return'thisisatest';};var_dump(isset($container['test']));echo$container['测试'];取消设置($容器['测试']);参考预定义接口