本篇文章帶給大家的內容是關於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的介紹(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!