summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2008-01-27 18:07:20 +0000
committerMarcus Boerger <helly@php.net>2008-01-27 18:07:20 +0000
commita339867860668ae57d6f3bb311299db5f45571c0 (patch)
tree700ded48f51b38d01e45a695703356eba8af120e
parentdc04a42e5cc54882d762e174b938fb36ac72c731 (diff)
downloadphp-git-a339867860668ae57d6f3bb311299db5f45571c0.tar.gz
MFH:
[DOC] Add ability to store associative infor with objects in SplObjectStorage - Add second parameter to SplObjectStorage::attach() - Add SplObjectStorage::setInfo() - Add SplObjectStorage::getInfo()
-rw-r--r--NEWS2
-rwxr-xr-xext/spl/internal/splobjectstorage.inc38
-rwxr-xr-xext/spl/spl_observer.c171
-rwxr-xr-xext/spl/tests/observer_004.phpt44
-rwxr-xr-xext/spl/tests/observer_005.phpt92
-rwxr-xr-xext/spl/tests/observer_006.phpt312
6 files changed, 567 insertions, 92 deletions
diff --git a/NEWS b/NEWS
index 76872801e8..aec23fe3ff 100644
--- a/NEWS
+++ b/NEWS
@@ -19,6 +19,8 @@ PHP NEWS
* date_timestamp_set() / DateTime::setTimestamp() to set a Unix timestamp
without invoking the date parser. (Scott)
+- Added ability to store associative infor with objects in SplObjectStorage.
+ (Marcus)
- Added ability to use Traversable objects instead of plain arrays in ext/soap.
(Joshua Reese, Dmitry)
- Added "?:" operator. (Marcus)
diff --git a/ext/spl/internal/splobjectstorage.inc b/ext/spl/internal/splobjectstorage.inc
index 278e64151d..c7a56b43e1 100755
--- a/ext/spl/internal/splobjectstorage.inc
+++ b/ext/spl/internal/splobjectstorage.inc
@@ -4,7 +4,7 @@
* @ingroup SPL
* @brief class SplObjectStorage
* @author Marcus Boerger
- * @date 2003 - 2005
+ * @date 2003 - 2008
*
* SPL - Standard PHP Library
*/
@@ -12,7 +12,7 @@
/**
* @brief Object storage
* @author Marcus Boerger
- * @version 1.0
+ * @version 1.1
* @since PHP 5.1.2
*
* This container allows to store objects uniquly without the need to compare
@@ -50,7 +50,27 @@ class SplObjectStorage implements Iterator, Countable
*/
function current()
{
- return current($this->storage);
+ $element = current($this->storage);
+ return $element ? $element[0] : NULL
+ }
+
+ /** @return get current object's associated information
+ * @since 5.3.0
+ */
+ function getInfo()
+ {
+ $element = current($this->storage);
+ return $element ? $element[1] : NULL
+ }
+
+ /** @return set current object's associated information
+ * @since 5.3.0
+ */
+ function setInfo($inf = NULL)
+ {
+ if ($this->valid()) {
+ $this->storage[$this->index][1] = $inf;
+ }
}
/** Forward to next element
@@ -75,9 +95,9 @@ class SplObjectStorage implements Iterator, Countable
{
if (is_object($obj))
{
- foreach($this->storage as $object)
+ foreach($this->storage as $element)
{
- if ($object === $obj)
+ if ($object === $element[0])
{
return true;
}
@@ -88,11 +108,11 @@ class SplObjectStorage implements Iterator, Countable
/** @param $obj new object to attach to storage if not yet contained
*/
- function attach($obj)
+ function attach($obj, $inf = NULL)
{
if (is_object($obj) && !$this->contains($obj))
{
- $this->storage[] = $obj;
+ $this->storage[] = array($obj, $inf);
}
}
@@ -102,9 +122,9 @@ class SplObjectStorage implements Iterator, Countable
{
if (is_object($obj))
{
- foreach($this->storage as $idx => $object)
+ foreach($this->storage as $idx => $element)
{
- if ($object === $obj)
+ if ($object === $element[0])
{
unset($this->storage[$idx]);
$this->rewind();
diff --git a/ext/spl/spl_observer.c b/ext/spl/spl_observer.c
index be09ea2cbb..d9d7dc2d09 100755
--- a/ext/spl/spl_observer.c
+++ b/ext/spl/spl_observer.c
@@ -75,14 +75,18 @@ PHPAPI zend_class_entry *spl_ce_SplSubject;
PHPAPI zend_class_entry *spl_ce_SplObjectStorage;
PHPAPI zend_object_handlers spl_handler_SplObjectStorage;
-typedef struct _spl_SplObjectStorage {
+typedef struct _spl_SplObjectStorage { /* {{{ */
zend_object std;
HashTable storage;
long index;
HashPosition pos;
-} spl_SplObjectStorage;
+} spl_SplObjectStorage; /* }}} */
-/* storage is an assoc aray of [zend_object_value]=>[zval*] */
+/* {{{ storage is an assoc aray of [zend_object_value]=>[zval *obj, zval *inf] */
+typedef struct _spl_SplObjectStorageElement {
+ zval* obj;
+ zval* inf;
+} spl_SplObjectStorageElement; /* }}} */
void spl_SplOjectStorage_free_storage(void *object TSRMLS_DC) /* {{{ */
{
@@ -95,9 +99,10 @@ void spl_SplOjectStorage_free_storage(void *object TSRMLS_DC) /* {{{ */
efree(object);
} /* }}} */
-static void spl_object_storage_dtor(zval **element) /* {{{ */
+static void spl_object_storage_dtor(spl_SplObjectStorageElement *element) /* {{{ */
{
- zval_ptr_dtor(element);
+ zval_ptr_dtor(&element->obj);
+ zval_ptr_dtor(&element->inf);
} /* }}} */
static zend_object_value spl_object_storage_new_ex(zend_class_entry *class_type, spl_SplObjectStorage **obj, zval *orig TSRMLS_DC) /* {{{ */
@@ -124,9 +129,10 @@ static zend_object_value spl_object_storage_new_ex(zend_class_entry *class_type,
static HashTable* spl_object_storage_debug_info(zval *obj, int *is_temp TSRMLS_DC) /* {{{ */
{
spl_SplObjectStorage *intern = (spl_SplObjectStorage*)zend_object_store_get_object(obj TSRMLS_CC);
+ spl_SplObjectStorageElement *element;
HashTable *rv, *props;
HashPosition pos;
- zval *tmp, *storage, **entry;
+ zval *tmp, *storage;
char md5str[33];
int name_len;
char *zname;
@@ -143,10 +149,15 @@ static HashTable* spl_object_storage_debug_info(zval *obj, int *is_temp TSRMLS_D
array_init(storage);
zend_hash_internal_pointer_reset_ex(&intern->storage, &pos);
- while (zend_hash_get_current_data_ex(&intern->storage, (void **)&entry, &pos) == SUCCESS) {
- php_spl_object_hash(*entry, md5str TSRMLS_CC);
- zval_add_ref(entry);
- add_assoc_zval_ex(storage, md5str, 33, *entry);
+ while (zend_hash_get_current_data_ex(&intern->storage, (void **)&element, &pos) == SUCCESS) {
+ php_spl_object_hash(element->obj, md5str TSRMLS_CC);
+ Z_ADDREF_P(element->obj);
+ Z_ADDREF_P(element->inf);
+ MAKE_STD_ZVAL(tmp);
+ array_init(tmp);
+ add_assoc_zval_ex(tmp, "obj", sizeof("obj"), element->obj);
+ add_assoc_zval_ex(tmp, "inf", sizeof("inf"), element->inf);
+ add_assoc_zval_ex(storage, md5str, 33, tmp);
zend_hash_move_forward_ex(&intern->storage, &pos);
}
@@ -181,21 +192,53 @@ int spl_object_storage_contains(spl_SplObjectStorage *intern, zval *obj TSRMLS_D
#endif
} /* }}} */
-void spl_object_storage_attach(spl_SplObjectStorage *intern, zval *obj TSRMLS_DC) /* {{{ */
+spl_SplObjectStorageElement* spl_object_storage_get(spl_SplObjectStorage *intern, zval *obj TSRMLS_DC) /* {{{ */
{
- if (spl_object_storage_contains(intern, obj TSRMLS_CC)) {
- return; /* already contained */
+ spl_SplObjectStorageElement *element;
+ zend_object_value *pzvalue;
+#if HAVE_PACKED_OBJECT_VALUE
+ pzvalue = &Z_OBJVAL_P(obj);
+#else
+ zend_object_value zvalue;
+ memset(&zvalue, 0, sizeof(zend_object_value));
+ zvalue.handle = Z_OBJ_HANDLE_P(obj);
+ zvalue.handlers = Z_OBJ_HT_P(obj);
+ pzvalue = &zvalue;
+#endif
+ if (zend_hash_find(&intern->storage, (char*)pzvalue, sizeof(zend_object_value), (void**)&element) == SUCCESS) {
+ return element;
+ } else {
+ return NULL;
+ }
+} /* }}} */
+
+
+void spl_object_storage_attach(spl_SplObjectStorage *intern, zval *obj, zval *inf TSRMLS_DC) /* {{{ */
+{
+ spl_SplObjectStorageElement *pelement, element;
+ pelement = spl_object_storage_get(intern, obj TSRMLS_CC);
+ if (inf) {
+ Z_ADDREF_P(inf);
+ } else {
+ ALLOC_INIT_ZVAL(inf);
+ }
+ if (pelement) {
+ zval_ptr_dtor(&pelement->inf);
+ pelement->inf = inf;
+ return;
}
Z_ADDREF_P(obj);
+ element.obj = obj;
+ element.inf = inf;
#if HAVE_PACKED_OBJECT_VALUE
- zend_hash_update(&intern->storage, (char*)&Z_OBJVAL_P(obj), sizeof(zend_object_value), &obj, sizeof(zval*), NULL);
+ zend_hash_update(&intern->storage, (char*)&Z_OBJVAL_P(obj), sizeof(zend_object_value), &element, sizeof(spl_SplObjectStorageElement), NULL);
#else
{
zend_object_value zvalue;
memset(&zvalue, 0, sizeof(zend_object_value));
zvalue.handle = Z_OBJ_HANDLE_P(obj);
zvalue.handlers = Z_OBJ_HT_P(obj);
- zend_hash_update(&intern->storage, (char*)&zvalue, sizeof(zend_object_value), &obj, sizeof(zval*), NULL);
+ zend_hash_update(&intern->storage, (char*)&zvalue, sizeof(zend_object_value), &element, sizeof(spl_SplObjectStorageElement), NULL);
}
#endif
} /* }}} */
@@ -215,18 +258,18 @@ void spl_object_storage_detach(spl_SplObjectStorage *intern, zval *obj TSRMLS_DC
#endif
} /* }}}*/
-/* {{{ proto void SplObjectStorage::attach($obj)
+/* {{{ proto void SplObjectStorage::attach($obj, $inf = NULL)
Attaches an object to the storage if not yet contained */
SPL_METHOD(SplObjectStorage, attach)
{
- zval *obj;
+ zval *obj, *inf = NULL;
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) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o|z!", &obj, &inf) == FAILURE) {
return;
}
- spl_object_storage_attach(intern, obj TSRMLS_CC);
+ spl_object_storage_attach(intern, obj, inf TSRMLS_CC);
} /* }}} */
/* {{{ proto void SplObjectStorage::detach($obj)
@@ -268,7 +311,7 @@ SPL_METHOD(SplObjectStorage, count)
} /* }}} */
/* {{{ proto void SplObjectStorage::rewind()
- */
+ Rewind to first position */
SPL_METHOD(SplObjectStorage, rewind)
{
spl_SplObjectStorage *intern = (spl_SplObjectStorage*)zend_object_store_get_object(getThis() TSRMLS_CC);
@@ -278,7 +321,7 @@ SPL_METHOD(SplObjectStorage, rewind)
} /* }}} */
/* {{{ proto bool SplObjectStorage::valid()
- */
+ Returns whether current position is valid */
SPL_METHOD(SplObjectStorage, valid)
{
spl_SplObjectStorage *intern = (spl_SplObjectStorage*)zend_object_store_get_object(getThis() TSRMLS_CC);
@@ -287,7 +330,7 @@ SPL_METHOD(SplObjectStorage, valid)
} /* }}} */
/* {{{ proto mixed SplObjectStorage::key()
- */
+ Returns current key */
SPL_METHOD(SplObjectStorage, key)
{
spl_SplObjectStorage *intern = (spl_SplObjectStorage*)zend_object_store_get_object(getThis() TSRMLS_CC);
@@ -296,20 +339,53 @@ SPL_METHOD(SplObjectStorage, key)
} /* }}} */
/* {{{ proto mixed SplObjectStorage::current()
- */
+ Returns current element */
SPL_METHOD(SplObjectStorage, current)
{
- zval **entry;
+ spl_SplObjectStorageElement *element;
+ spl_SplObjectStorage *intern = (spl_SplObjectStorage*)zend_object_store_get_object(getThis() TSRMLS_CC);
+
+ if (zend_hash_get_current_data_ex(&intern->storage, (void**)&element, &intern->pos) == FAILURE) {
+ return;
+ }
+ RETVAL_ZVAL(element->obj, 1, 0);
+} /* }}} */
+
+/* {{{ proto mixed SplObjectStorage::getInfo()
+ Returns associated information to current element */
+SPL_METHOD(SplObjectStorage, getInfo)
+{
+ spl_SplObjectStorageElement *element;
+ spl_SplObjectStorage *intern = (spl_SplObjectStorage*)zend_object_store_get_object(getThis() TSRMLS_CC);
+
+ if (zend_hash_get_current_data_ex(&intern->storage, (void**)&element, &intern->pos) == FAILURE) {
+ return;
+ }
+ RETVAL_ZVAL(element->inf, 1, 0);
+} /* }}} */
+
+/* {{{ proto mixed SplObjectStorage::setInfo(mixed $inf)
+ Sets associated information of current element to $inf */
+SPL_METHOD(SplObjectStorage, setInfo)
+{
+ spl_SplObjectStorageElement *element;
spl_SplObjectStorage *intern = (spl_SplObjectStorage*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ zval *inf;
- if (zend_hash_get_current_data_ex(&intern->storage, (void**)&entry, &intern->pos) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &inf) == FAILURE) {
+ return;
+ }
+
+ if (zend_hash_get_current_data_ex(&intern->storage, (void**)&element, &intern->pos) == FAILURE) {
return;
}
- RETVAL_ZVAL(*entry, 1, 0);
+ zval_ptr_dtor(&element->inf);
+ element->inf = inf;
+ Z_ADDREF_P(inf);
} /* }}} */
/* {{{ proto void SplObjectStorage::next()
- */
+ Moves position forward */
SPL_METHOD(SplObjectStorage, next)
{
spl_SplObjectStorage *intern = (spl_SplObjectStorage*)zend_object_store_get_object(getThis() TSRMLS_CC);
@@ -319,12 +395,13 @@ SPL_METHOD(SplObjectStorage, next)
} /* }}} */
/* {{{ proto string SplObjectStorage::serialize()
- */
+ Serializes storage */
SPL_METHOD(SplObjectStorage, serialize)
{
spl_SplObjectStorage *intern = (spl_SplObjectStorage*)zend_object_store_get_object(getThis() TSRMLS_CC);
- zval **entry, members, *pmembers;
+ spl_SplObjectStorageElement *element;
+ zval members, *pmembers;
HashPosition pos;
php_serialize_data_t var_hash;
smart_str buf = {0};
@@ -339,12 +416,14 @@ SPL_METHOD(SplObjectStorage, serialize)
zend_hash_internal_pointer_reset_ex(&intern->storage, &pos);
while(zend_hash_has_more_elements_ex(&intern->storage, &pos) == SUCCESS) {
- if (zend_hash_get_current_data_ex(&intern->storage, (void**)&entry, &pos) == FAILURE) {
+ if (zend_hash_get_current_data_ex(&intern->storage, (void**)&element, &pos) == FAILURE) {
smart_str_free(&buf);
PHP_VAR_SERIALIZE_DESTROY(var_hash);
RETURN_NULL();
}
- php_var_serialize(&buf, entry, &var_hash TSRMLS_CC);
+ php_var_serialize(&buf, &element->obj, &var_hash TSRMLS_CC);
+ smart_str_appendc(&buf, ',');
+ php_var_serialize(&buf, &element->inf, &var_hash TSRMLS_CC);
smart_str_appendc(&buf, ';');
zend_hash_move_forward_ex(&intern->storage, &pos);
}
@@ -369,7 +448,7 @@ SPL_METHOD(SplObjectStorage, serialize)
} /* }}} */
/* {{{ proto void SplObjectStorage::unserialize(string serialized)
- */
+ Unserializes storage */
SPL_METHOD(SplObjectStorage, unserialize)
{
spl_SplObjectStorage *intern = (spl_SplObjectStorage*)zend_object_store_get_object(getThis() TSRMLS_CC);
@@ -378,7 +457,7 @@ SPL_METHOD(SplObjectStorage, unserialize)
int buf_len;
const unsigned char *p, *s;
php_unserialize_data_t var_hash;
- zval *pentry, *pmembers, *pcount = NULL;
+ zval *pentry, *pmembers, *pcount = NULL, *pinf;
long count;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &buf, &buf_len) == FAILURE) {
@@ -419,8 +498,17 @@ SPL_METHOD(SplObjectStorage, unserialize)
zval_ptr_dtor(&pentry);
goto outexcept;
}
- spl_object_storage_attach(intern, pentry TSRMLS_CC);
+ ALLOC_INIT_ZVAL(pinf);
+ if (*p == ',') { /* new version has inf */
+ ++p;
+ if (!php_var_unserialize(&pinf, &p, s + buf_len, &var_hash TSRMLS_CC)) {
+ zval_ptr_dtor(&pinf);
+ goto outexcept;
+ }
+ }
+ spl_object_storage_attach(intern, pentry, pinf TSRMLS_CC);
zval_ptr_dtor(&pentry);
+ zval_ptr_dtor(&pinf);
}
if (*p != ';') {
@@ -462,12 +550,23 @@ ZEND_BEGIN_ARG_INFO(arginfo_Object, 0)
ZEND_END_ARG_INFO();
static
+ZEND_BEGIN_ARG_INFO_EX(arginfo_attach, 0, 0, 1)
+ ZEND_ARG_INFO(0, object)
+ ZEND_ARG_INFO(0, inf)
+ZEND_END_ARG_INFO();
+
+static
ZEND_BEGIN_ARG_INFO(arginfo_Serialized, 0)
ZEND_ARG_INFO(0, serialized)
ZEND_END_ARG_INFO();
+static
+ZEND_BEGIN_ARG_INFO(arginfo_setInfo, 0)
+ ZEND_ARG_INFO(0, info)
+ZEND_END_ARG_INFO();
+
static const zend_function_entry spl_funcs_SplObjectStorage[] = {
- SPL_ME(SplObjectStorage, attach, arginfo_Object, 0)
+ SPL_ME(SplObjectStorage, attach, arginfo_attach, 0)
SPL_ME(SplObjectStorage, detach, arginfo_Object, 0)
SPL_ME(SplObjectStorage, contains, arginfo_Object, 0)
SPL_ME(SplObjectStorage, count, NULL, 0)
@@ -478,6 +577,8 @@ static const zend_function_entry spl_funcs_SplObjectStorage[] = {
SPL_ME(SplObjectStorage, next, NULL, 0)
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)
{NULL, NULL, NULL}
};
diff --git a/ext/spl/tests/observer_004.phpt b/ext/spl/tests/observer_004.phpt
index c24f5ed777..cfc207395d 100755
--- a/ext/spl/tests/observer_004.phpt
+++ b/ext/spl/tests/observer_004.phpt
@@ -68,14 +68,24 @@ object(MyStorage)#%d (2) {
["storage":"SplObjectStorage":private]=>
array(2) {
["%s"]=>
- object(TestClass)#%d (1) {
- ["test"]=>
- int(1)
+ array(2) {
+ ["obj"]=>
+ object(TestClass)#%d (1) {
+ ["test"]=>
+ int(1)
+ }
+ ["inf"]=>
+ NULL
}
["%s"]=>
- object(TestClass)#%d (1) {
- ["test"]=>
- int(2)
+ array(2) {
+ ["obj"]=>
+ object(TestClass)#%d (1) {
+ ["test"]=>
+ int(2)
+ }
+ ["inf"]=>
+ NULL
}
}
}
@@ -90,14 +100,24 @@ object(MyStorage)#%d (2) {
["storage":"SplObjectStorage":private]=>
array(2) {
["%s"]=>
- object(TestClass)#%d (1) {
- ["test"]=>
- int(1)
+ array(2) {
+ ["obj"]=>
+ object(TestClass)#%d (1) {
+ ["test"]=>
+ int(1)
+ }
+ ["inf"]=>
+ NULL
}
["%s"]=>
- object(TestClass)#%d (1) {
- ["test"]=>
- int(2)
+ array(2) {
+ ["obj"]=>
+ object(TestClass)#%d (1) {
+ ["test"]=>
+ int(2)
+ }
+ ["inf"]=>
+ NULL
}
}
}
diff --git a/ext/spl/tests/observer_005.phpt b/ext/spl/tests/observer_005.phpt
index ae5966bfe7..4d4d717842 100755
--- a/ext/spl/tests/observer_005.phpt
+++ b/ext/spl/tests/observer_005.phpt
@@ -110,26 +110,36 @@ object(MyStorage)#%d (5) {
["storage":"SplObjectStorage":private]=>
array(2) {
["%s"]=>
- object(TestClass)#%d (4) {
- ["def"]=>
- int(24)
- ["pub"]=>
- int(4)
- ["pro":protected]=>
- int(5)
- ["pri":"TestClass":private]=>
- int(6)
+ array(2) {
+ ["obj"]=>
+ object(TestClass)#%d (4) {
+ ["def"]=>
+ int(24)
+ ["pub"]=>
+ int(4)
+ ["pro":protected]=>
+ int(5)
+ ["pri":"TestClass":private]=>
+ int(6)
+ }
+ ["inf"]=>
+ NULL
}
["%s"]=>
- object(TestClass)#%d (4) {
- ["def"]=>
- int(24)
- ["pub"]=>
- int(7)
- ["pro":protected]=>
- int(8)
- ["pri":"TestClass":private]=>
- int(9)
+ array(2) {
+ ["obj"]=>
+ object(TestClass)#%d (4) {
+ ["def"]=>
+ int(24)
+ ["pub"]=>
+ int(7)
+ ["pro":protected]=>
+ int(8)
+ ["pri":"TestClass":private]=>
+ int(9)
+ }
+ ["inf"]=>
+ NULL
}
}
}
@@ -168,26 +178,36 @@ object(MyStorage)#%d (5) {
["storage":"SplObjectStorage":private]=>
array(2) {
["%s"]=>
- object(TestClass)#%d (4) {
- ["def"]=>
- int(24)
- ["pub"]=>
- int(4)
- ["pro":protected]=>
- int(5)
- ["pri":"TestClass":private]=>
- int(6)
+ array(2) {
+ ["obj"]=>
+ object(TestClass)#%d (4) {
+ ["def"]=>
+ int(24)
+ ["pub"]=>
+ int(4)
+ ["pro":protected]=>
+ int(5)
+ ["pri":"TestClass":private]=>
+ int(6)
+ }
+ ["inf"]=>
+ NULL
}
["%s"]=>
- object(TestClass)#%d (4) {
- ["def"]=>
- int(24)
- ["pub"]=>
- int(7)
- ["pro":protected]=>
- int(8)
- ["pri":"TestClass":private]=>
- int(9)
+ array(2) {
+ ["obj"]=>
+ object(TestClass)#%d (4) {
+ ["def"]=>
+ int(24)
+ ["pub"]=>
+ int(7)
+ ["pro":protected]=>
+ int(8)
+ ["pri":"TestClass":private]=>
+ int(9)
+ }
+ ["inf"]=>
+ NULL
}
}
}
diff --git a/ext/spl/tests/observer_006.phpt b/ext/spl/tests/observer_006.phpt
new file mode 100755
index 0000000000..fc4a907b42
--- /dev/null
+++ b/ext/spl/tests/observer_006.phpt
@@ -0,0 +1,312 @@
+--TEST--
+SPL: SplObjectStorage with accociatied information
+--SKIPIF--
+<?php if (!extension_loaded("spl")) print "skip"; ?>
+--FILE--
+<?php
+
+class TestClass
+{
+ public $test = 25;
+
+ public function __construct($test = 42)
+ {
+ $this->test = $test;
+ }
+}
+
+class MyStorage extends SplObjectStorage
+{
+ public $bla = 25;
+
+ public function __construct($bla = 26)
+ {
+ $this->bla = $bla;
+ }
+}
+
+$storage = new MyStorage();
+
+foreach(array(1=>"foo",2=>42) as $key => $value)
+{
+ $storage->attach(new TestClass($key), $value);
+}
+
+var_dump(count($storage));
+
+foreach($storage as $object)
+{
+ var_dump($object->test);
+}
+
+var_dump($storage);
+
+var_dump(serialize($storage));
+echo "===UNSERIALIZE===\n";
+
+$storage2 = unserialize(serialize($storage));
+
+var_dump(count($storage2));
+
+foreach($storage2 as $object)
+{
+ var_dump($object->test);
+}
+
+var_dump($storage2);
+$storage->attach(new TestClass(3), new stdClass);
+$storage->attach(new TestClass(4), new TestClass(5));
+echo "===UNSERIALIZE2===\n";
+var_dump(unserialize(serialize($storage)));
+$storage->rewind();
+$storage->next();
+var_dump($storage->key());
+var_dump($storage->current());
+var_dump($storage->getInfo());
+$storage->setInfo("bar");
+var_dump($storage->getInfo());
+echo "===UNSERIALIZE3===\n";
+var_dump(unserialize(serialize($storage)));
+$storage->rewind();
+$storage->next();
+$storage->next();
+var_dump($storage->key());
+var_dump($storage->current());
+$storage->attach($storage->current(), "replaced");
+echo "===UNSERIALIZE4===\n";
+var_dump(unserialize(serialize($storage)));
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+int(2)
+int(1)
+int(2)
+object(MyStorage)#%d (2) {
+ ["bla"]=>
+ int(26)
+ ["storage":"SplObjectStorage":private]=>
+ array(2) {
+ ["%s"]=>
+ array(2) {
+ ["obj"]=>
+ object(TestClass)#%d (1) {
+ ["test"]=>
+ int(1)
+ }
+ ["inf"]=>
+ string(3) "foo"
+ }
+ ["%s"]=>
+ array(2) {
+ ["obj"]=>
+ object(TestClass)#%d (1) {
+ ["test"]=>
+ int(2)
+ }
+ ["inf"]=>
+ int(42)
+ }
+ }
+}
+string(%d) "%s"
+===UNSERIALIZE===
+int(2)
+int(1)
+int(2)
+object(MyStorage)#%d (2) {
+ ["bla"]=>
+ int(26)
+ ["storage":"SplObjectStorage":private]=>
+ array(2) {
+ ["%s"]=>
+ array(2) {
+ ["obj"]=>
+ object(TestClass)#%d (1) {
+ ["test"]=>
+ int(1)
+ }
+ ["inf"]=>
+ string(3) "foo"
+ }
+ ["%s"]=>
+ array(2) {
+ ["obj"]=>
+ object(TestClass)#%d (1) {
+ ["test"]=>
+ int(2)
+ }
+ ["inf"]=>
+ int(42)
+ }
+ }
+}
+===UNSERIALIZE2===
+object(MyStorage)#%d (2) {
+ ["bla"]=>
+ int(26)
+ ["storage":"SplObjectStorage":private]=>
+ array(4) {
+ ["%s"]=>
+ array(2) {
+ ["obj"]=>
+ object(TestClass)#%d (1) {
+ ["test"]=>
+ int(1)
+ }
+ ["inf"]=>
+ string(3) "foo"
+ }
+ ["%s"]=>
+ array(2) {
+ ["obj"]=>
+ object(TestClass)#%d (1) {
+ ["test"]=>
+ int(2)
+ }
+ ["inf"]=>
+ int(42)
+ }
+ ["%s"]=>
+ array(2) {
+ ["obj"]=>
+ object(TestClass)#%d (1) {
+ ["test"]=>
+ int(3)
+ }
+ ["inf"]=>
+ object(stdClass)#%d (0) {
+ }
+ }
+ ["%s"]=>
+ array(2) {
+ ["obj"]=>
+ object(TestClass)#%d (1) {
+ ["test"]=>
+ int(4)
+ }
+ ["inf"]=>
+ object(TestClass)#%d (1) {
+ ["test"]=>
+ int(5)
+ }
+ }
+ }
+}
+int(1)
+object(TestClass)#%d (1) {
+ ["test"]=>
+ int(2)
+}
+int(42)
+string(3) "bar"
+===UNSERIALIZE3===
+object(MyStorage)#%d (2) {
+ ["bla"]=>
+ int(26)
+ ["storage":"SplObjectStorage":private]=>
+ array(4) {
+ ["%s"]=>
+ array(2) {
+ ["obj"]=>
+ object(TestClass)#%d (1) {
+ ["test"]=>
+ int(1)
+ }
+ ["inf"]=>
+ string(3) "foo"
+ }
+ ["%s"]=>
+ array(2) {
+ ["obj"]=>
+ object(TestClass)#%d (1) {
+ ["test"]=>
+ int(2)
+ }
+ ["inf"]=>
+ string(3) "bar"
+ }
+ ["%s"]=>
+ array(2) {
+ ["obj"]=>
+ object(TestClass)#%d (1) {
+ ["test"]=>
+ int(3)
+ }
+ ["inf"]=>
+ object(stdClass)#%d (0) {
+ }
+ }
+ ["%s"]=>
+ array(2) {
+ ["obj"]=>
+ object(TestClass)#%d (1) {
+ ["test"]=>
+ int(4)
+ }
+ ["inf"]=>
+ object(TestClass)#%d (1) {
+ ["test"]=>
+ int(5)
+ }
+ }
+ }
+}
+int(2)
+object(TestClass)#7 (1) {
+ ["test"]=>
+ int(3)
+}
+===UNSERIALIZE4===
+object(MyStorage)#%d (2) {
+ ["bla"]=>
+ int(26)
+ ["storage":"SplObjectStorage":private]=>
+ array(4) {
+ ["%s"]=>
+ array(2) {
+ ["obj"]=>
+ object(TestClass)#%d (1) {
+ ["test"]=>
+ int(1)
+ }
+ ["inf"]=>
+ string(3) "foo"
+ }
+ ["%s"]=>
+ array(2) {
+ ["obj"]=>
+ object(TestClass)#%d (1) {
+ ["test"]=>
+ int(2)
+ }
+ ["inf"]=>
+ string(3) "bar"
+ }
+ ["%s"]=>
+ array(2) {
+ ["obj"]=>
+ object(TestClass)#%d (1) {
+ ["test"]=>
+ int(3)
+ }
+ ["inf"]=>
+ string(8) "replaced"
+ }
+ ["%s"]=>
+ array(2) {
+ ["obj"]=>
+ object(TestClass)#%d (1) {
+ ["test"]=>
+ int(4)
+ }
+ ["inf"]=>
+ object(TestClass)#%d (1) {
+ ["test"]=>
+ int(5)
+ }
+ }
+ }
+}
+===DONE===