* here therefore has a complexity of O(n) while the actual implementation has
* complexity O(1).
*/
-class SplObjectStorage implements Iterator, Countable
+class SplObjectStorage implements Iterator, Countable, ArrayAccess
{
private $storage = array();
private $index = 0;
return count($this->storage);
}
- /** @param obj object to look for
+ /** @param $obj object to look for
* @return whether $obj is contained in storage
- */
+ */
function contains($obj)
{
if (is_object($obj))
return false;
}
- /** @param $obj new object to attach to storage if not yet contained
+ /** @param $obj new object to attach to storage or object whose
+ * associative information is to be replaced
+ * @param $inf associative information stored along the object
*/
function attach($obj, $inf = NULL)
{
}
}
}
+
+ /** @param $obj new object to attach to storage or object whose
+ * associative information is to be replaced
+ * @param $inf associative information stored along the object
+ * @since 5.3.0
+ */
+ function offsetSet($obj, $inf)
+ {
+ $this->attach($obj, $inf);
+ }
+
+ /** @param $obj Exising object to look for
+ * @return associative information stored with object
+ * @throw UnexpectedValueException if Object $obj is not contained in
+ * storage
+ * @since 5.3.0
+ */
+ function offsetGet($obj)
+ {
+ if (is_object($obj))
+ {
+ foreach($this->storage as $idx => $element)
+ {
+ if ($object === $element[0])
+ {
+ return $element[1];
+ }
+ }
+ }
+ throw new UnexpectedValueException('Object not found');
+ }
+
+ /** @param $obj Exising object to look for
+ * @return associative information stored with object
+ * @since 5.3.0
+ */
+ function offsetUnset($obj)
+ {
+ $this->detach($obj);
+ }
+
+ /** @param $obj object to look for
+ * @return whether $obj is contained in storage
+ */
+ function offsetEsists($obj)
+ {
+ return $this->contains($obj);
+ }
}
?>
intern->index = 0;
} /* }}} */
+/* {{{ proto mixed SplObjectStorage::offsetGet($object) U
+ Returns associated information for a stored object */
+SPL_METHOD(SplObjectStorage, offsetGet)
+{
+ zval *obj;
+ spl_SplObjectStorageElement *element;
+ spl_SplObjectStorage *intern = (spl_SplObjectStorage*)zend_object_store_get_object(getThis() TSRMLS_CC);
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &obj) == FAILURE) {
+ return;
+ }
+ element = spl_object_storage_get(intern, obj TSRMLS_CC);
+ if (!element) {
+ zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Object not found");
+ } else {
+ RETURN_ZVAL(element->inf,1, 0);
+ }
+} /* }}} */
+
/* {{{ proto bool SplObjectStorage::contains($obj) U
Determine whethe an object is contained in the storage */
SPL_METHOD(SplObjectStorage, contains)
ZEND_ARG_INFO(0, info)
ZEND_END_ARG_INFO();
+static
+ZEND_BEGIN_ARG_INFO_EX(arginfo_offsetGet, 0, 0, 1)
+ ZEND_ARG_INFO(0, object)
+ZEND_END_ARG_INFO()
+
+static
+ZEND_BEGIN_ARG_INFO_EX(arginfo_offsetSet, 0, 0, 2)
+ ZEND_ARG_INFO(0, object)
+ ZEND_ARG_INFO(0, info)
+ZEND_END_ARG_INFO()
+
static const zend_function_entry spl_funcs_SplObjectStorage[] = {
SPL_ME(SplObjectStorage, attach, arginfo_attach, 0)
SPL_ME(SplObjectStorage, detach, arginfo_Object, 0)
SPL_ME(SplObjectStorage, contains, arginfo_Object, 0)
+ SPL_ME(SplObjectStorage, getInfo, NULL, 0)
+ SPL_ME(SplObjectStorage, setInfo, arginfo_setInfo, 0)
+ /* Countable */
SPL_ME(SplObjectStorage, count, NULL, 0)
+ /* Iterator */
SPL_ME(SplObjectStorage, rewind, NULL, 0)
SPL_ME(SplObjectStorage, valid, NULL, 0)
SPL_ME(SplObjectStorage, key, NULL, 0)
SPL_ME(SplObjectStorage, current, NULL, 0)
SPL_ME(SplObjectStorage, next, NULL, 0)
+ /* Serializable */
SPL_ME(SplObjectStorage, unserialize, arginfo_Serialized, 0)
SPL_ME(SplObjectStorage, serialize, NULL, 0)
- SPL_ME(SplObjectStorage, getInfo, NULL, 0)
- SPL_ME(SplObjectStorage, setInfo, arginfo_setInfo, 0)
+ /* ArrayAccess */
+ SPL_MA(SplObjectStorage, offsetExists, SplObjectStorage, contains, arginfo_offsetGet, 0)
+ SPL_MA(SplObjectStorage, offsetSet, SplObjectStorage, attach, arginfo_offsetSet, 0)
+ SPL_MA(SplObjectStorage, offsetUnset, SplObjectStorage, detach, arginfo_offsetGet, 0)
+ SPL_ME(SplObjectStorage, offsetGet, arginfo_offsetGet, 0)
{NULL, NULL, NULL}
};
REGISTER_SPL_IMPLEMENTS(SplObjectStorage, Countable);
REGISTER_SPL_IMPLEMENTS(SplObjectStorage, Iterator);
REGISTER_SPL_IMPLEMENTS(SplObjectStorage, Serializable);
+ REGISTER_SPL_IMPLEMENTS(SplObjectStorage, ArrayAccess);
return SUCCESS;
}