Le contenu de cet article porte sur qu'est-ce qu'ArrayAccess en php ? L'introduction d'ArrayAccess en php (exemple de code) a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer, j'espère que cela vous sera utile.
php fournit 6 interfaces prédéfinies couramment utilisées pour implémenter certaines fonctionnalités spécifiques. Le plus couramment utilisé est ArrayAccess, qui est utilisé par des frameworks populaires comme Laravel.
Qu'est-ce qu'ArrayAccess ?
Comme indiqué dans la documentation officielle, il "fournit une interface qui offre la possibilité d'accéder à des objets tels que des tableaux".
Il fournit 4 interfaces
/** * 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); }
Nous implémentons ces 4 interfaces, qui correspondent tour à tour aux opérations isset, read, set et unset du tableau. A quoi sert
La définition est très claire, offrant la possibilité d'accéder à des objets comme accéder à des tableaux. En l'utilisant, une classe peut prendre en charge à la fois les références d'objet et les références de tableau.
Exemple d'implémentation de code
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('对象定义不合法'); } }
Exemple d'utilisation
$container = new Container(); $container['test'] = function () { return 'this is a test'; }; var_dump(isset($container['test'])); echo $container['test']; unset($container['test']);
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!