diff options
author | Marcus Boerger <helly@php.net> | 2008-01-27 18:07:20 +0000 |
---|---|---|
committer | Marcus Boerger <helly@php.net> | 2008-01-27 18:07:20 +0000 |
commit | a339867860668ae57d6f3bb311299db5f45571c0 (patch) | |
tree | 700ded48f51b38d01e45a695703356eba8af120e | |
parent | dc04a42e5cc54882d762e174b938fb36ac72c731 (diff) | |
download | php-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-- | NEWS | 2 | ||||
-rwxr-xr-x | ext/spl/internal/splobjectstorage.inc | 38 | ||||
-rwxr-xr-x | ext/spl/spl_observer.c | 171 | ||||
-rwxr-xr-x | ext/spl/tests/observer_004.phpt | 44 | ||||
-rwxr-xr-x | ext/spl/tests/observer_005.phpt | 92 | ||||
-rwxr-xr-x | ext/spl/tests/observer_006.phpt | 312 |
6 files changed, 567 insertions, 92 deletions
@@ -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=== |