Chris@0: setFlags($flags); Chris@0: $this->storage = $input; Chris@0: $this->setIteratorClass($iteratorClass); Chris@0: $this->protectedProperties = array_keys(get_object_vars($this)); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Returns whether the requested key exists Chris@0: * Chris@0: * @param mixed $key Chris@0: * @return bool Chris@0: */ Chris@0: public function __isset($key) Chris@0: { Chris@0: if ($this->flag == self::ARRAY_AS_PROPS) { Chris@0: return $this->offsetExists($key); Chris@0: } Chris@0: if (in_array($key, $this->protectedProperties)) { Chris@0: throw new Exception\InvalidArgumentException('$key is a protected property, use a different key'); Chris@0: } Chris@0: Chris@0: return isset($this->$key); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Sets the value at the specified key to value Chris@0: * Chris@0: * @param mixed $key Chris@0: * @param mixed $value Chris@0: * @return void Chris@0: */ Chris@0: public function __set($key, $value) Chris@0: { Chris@0: if ($this->flag == self::ARRAY_AS_PROPS) { Chris@0: return $this->offsetSet($key, $value); Chris@0: } Chris@0: if (in_array($key, $this->protectedProperties)) { Chris@0: throw new Exception\InvalidArgumentException('$key is a protected property, use a different key'); Chris@0: } Chris@0: $this->$key = $value; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Unsets the value at the specified key Chris@0: * Chris@0: * @param mixed $key Chris@0: * @return void Chris@0: */ Chris@0: public function __unset($key) Chris@0: { Chris@0: if ($this->flag == self::ARRAY_AS_PROPS) { Chris@0: return $this->offsetUnset($key); Chris@0: } Chris@0: if (in_array($key, $this->protectedProperties)) { Chris@0: throw new Exception\InvalidArgumentException('$key is a protected property, use a different key'); Chris@0: } Chris@0: unset($this->$key); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Returns the value at the specified key by reference Chris@0: * Chris@0: * @param mixed $key Chris@0: * @return mixed Chris@0: */ Chris@0: public function &__get($key) Chris@0: { Chris@0: $ret = null; Chris@0: if ($this->flag == self::ARRAY_AS_PROPS) { Chris@0: $ret =& $this->offsetGet($key); Chris@0: Chris@0: return $ret; Chris@0: } Chris@0: if (in_array($key, $this->protectedProperties)) { Chris@0: throw new Exception\InvalidArgumentException('$key is a protected property, use a different key'); Chris@0: } Chris@0: Chris@0: return $this->$key; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Appends the value Chris@0: * Chris@0: * @param mixed $value Chris@0: * @return void Chris@0: */ Chris@0: public function append($value) Chris@0: { Chris@0: $this->storage[] = $value; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Sort the entries by value Chris@0: * Chris@0: * @return void Chris@0: */ Chris@0: public function asort() Chris@0: { Chris@0: asort($this->storage); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get the number of public properties in the ArrayObject Chris@0: * Chris@0: * @return int Chris@0: */ Chris@0: public function count() Chris@0: { Chris@0: return count($this->storage); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Exchange the array for another one. Chris@0: * Chris@0: * @param array|ArrayObject $data Chris@0: * @return array Chris@0: */ Chris@0: public function exchangeArray($data) Chris@0: { Chris@12: if (! is_array($data) && ! is_object($data)) { Chris@12: throw new Exception\InvalidArgumentException( Chris@12: 'Passed variable is not an array or object, using empty array instead' Chris@12: ); Chris@0: } Chris@0: Chris@0: if (is_object($data) && ($data instanceof self || $data instanceof \ArrayObject)) { Chris@0: $data = $data->getArrayCopy(); Chris@0: } Chris@12: if (! is_array($data)) { Chris@0: $data = (array) $data; Chris@0: } Chris@0: Chris@0: $storage = $this->storage; Chris@0: Chris@0: $this->storage = $data; Chris@0: Chris@0: return $storage; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Creates a copy of the ArrayObject. Chris@0: * Chris@0: * @return array Chris@0: */ Chris@0: public function getArrayCopy() Chris@0: { Chris@0: return $this->storage; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Gets the behavior flags. Chris@0: * Chris@0: * @return int Chris@0: */ Chris@0: public function getFlags() Chris@0: { Chris@0: return $this->flag; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Create a new iterator from an ArrayObject instance Chris@0: * Chris@0: * @return \Iterator Chris@0: */ Chris@0: public function getIterator() Chris@0: { Chris@0: $class = $this->iteratorClass; Chris@0: Chris@0: return new $class($this->storage); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Gets the iterator classname for the ArrayObject. Chris@0: * Chris@0: * @return string Chris@0: */ Chris@0: public function getIteratorClass() Chris@0: { Chris@0: return $this->iteratorClass; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Sort the entries by key Chris@0: * Chris@0: * @return void Chris@0: */ Chris@0: public function ksort() Chris@0: { Chris@0: ksort($this->storage); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Sort an array using a case insensitive "natural order" algorithm Chris@0: * Chris@0: * @return void Chris@0: */ Chris@0: public function natcasesort() Chris@0: { Chris@0: natcasesort($this->storage); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Sort entries using a "natural order" algorithm Chris@0: * Chris@0: * @return void Chris@0: */ Chris@0: public function natsort() Chris@0: { Chris@0: natsort($this->storage); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Returns whether the requested key exists Chris@0: * Chris@0: * @param mixed $key Chris@0: * @return bool Chris@0: */ Chris@0: public function offsetExists($key) Chris@0: { Chris@0: return isset($this->storage[$key]); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Returns the value at the specified key Chris@0: * Chris@0: * @param mixed $key Chris@0: * @return mixed Chris@0: */ Chris@0: public function &offsetGet($key) Chris@0: { Chris@0: $ret = null; Chris@12: if (! $this->offsetExists($key)) { Chris@0: return $ret; Chris@0: } Chris@0: $ret =& $this->storage[$key]; Chris@0: Chris@0: return $ret; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Sets the value at the specified key to value Chris@0: * Chris@0: * @param mixed $key Chris@0: * @param mixed $value Chris@0: * @return void Chris@0: */ Chris@0: public function offsetSet($key, $value) Chris@0: { Chris@0: $this->storage[$key] = $value; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Unsets the value at the specified key Chris@0: * Chris@0: * @param mixed $key Chris@0: * @return void Chris@0: */ Chris@0: public function offsetUnset($key) Chris@0: { Chris@0: if ($this->offsetExists($key)) { Chris@0: unset($this->storage[$key]); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * Serialize an ArrayObject Chris@0: * Chris@0: * @return string Chris@0: */ Chris@0: public function serialize() Chris@0: { Chris@0: return serialize(get_object_vars($this)); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Sets the behavior flags Chris@0: * Chris@0: * @param int $flags Chris@0: * @return void Chris@0: */ Chris@0: public function setFlags($flags) Chris@0: { Chris@0: $this->flag = $flags; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Sets the iterator classname for the ArrayObject Chris@0: * Chris@0: * @param string $class Chris@0: * @return void Chris@0: */ Chris@0: public function setIteratorClass($class) Chris@0: { Chris@0: if (class_exists($class)) { Chris@0: $this->iteratorClass = $class; Chris@0: Chris@0: return ; Chris@0: } Chris@0: Chris@0: if (strpos($class, '\\') === 0) { Chris@0: $class = '\\' . $class; Chris@0: if (class_exists($class)) { Chris@0: $this->iteratorClass = $class; Chris@0: Chris@0: return ; Chris@0: } Chris@0: } Chris@0: Chris@0: throw new Exception\InvalidArgumentException('The iterator class does not exist'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Sort the entries with a user-defined comparison function and maintain key association Chris@0: * Chris@0: * @param callable $function Chris@0: * @return void Chris@0: */ Chris@0: public function uasort($function) Chris@0: { Chris@0: if (is_callable($function)) { Chris@0: uasort($this->storage, $function); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * Sort the entries by keys using a user-defined comparison function Chris@0: * Chris@0: * @param callable $function Chris@0: * @return void Chris@0: */ Chris@0: public function uksort($function) Chris@0: { Chris@0: if (is_callable($function)) { Chris@0: uksort($this->storage, $function); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * Unserialize an ArrayObject Chris@0: * Chris@0: * @param string $data Chris@0: * @return void Chris@0: */ Chris@0: public function unserialize($data) Chris@0: { Chris@0: $ar = unserialize($data); Chris@0: $this->protectedProperties = array_keys(get_object_vars($this)); Chris@0: Chris@0: $this->setFlags($ar['flag']); Chris@0: $this->exchangeArray($ar['storage']); Chris@0: $this->setIteratorClass($ar['iteratorClass']); Chris@0: Chris@0: foreach ($ar as $k => $v) { Chris@0: switch ($k) { Chris@0: case 'flag': Chris@0: $this->setFlags($v); Chris@0: break; Chris@0: case 'storage': Chris@0: $this->exchangeArray($v); Chris@0: break; Chris@0: case 'iteratorClass': Chris@0: $this->setIteratorClass($v); Chris@0: break; Chris@0: case 'protectedProperties': Chris@17: break; Chris@0: default: Chris@0: $this->__set($k, $v); Chris@0: } Chris@0: } Chris@0: } Chris@0: }