While I like SplWeekRef and the somewhat proposed SplWeekRefList, you’ll find attached a patch that exposes a simple function „refcount“ having this signature:
int refcount(mixed value) So if you would like to play around with it, have fun. It would be interesting to see if there are any other use cases besides destroying a reference. An idea for a userland implementation of SplWeekRefList with auto cleanup: let SplWeekRefList register a ticket function which executes cleanup with a certain propability. Something along the lines of this: <?php declare(ticks=1); class WeekRefList extends SplObjectStorage { public function __construct() { register_tick_function(array($this, 'cleanup')); } public function cleanup() { if (rand(1, 10) === 1) { foreach ($this as $entry) { // First ref is in ObjectStorage, second is $entry var if (refcount($entry) === 2) { unset($this[$entry]); } } } } } With regards, Lars Am 18.07.11 10:28 schrieb "Lars Schultz" unter <lars.schu...@toolpark.com>: >Am 18.07.2011 10:15, schrieb Ferenc Kovacs: >> I think that having to know and care about refcounts and zvals are >> more complicated than having an Spl class, which can hold a reference >> for a variable what can be destroyed to free memory. >> and there is a chance that people are familiar with the Weak >> references from other languages, while the zval approach only familiar >> for those that knows about php internals. >> so I think that from the userland POV, weak references are easier to >>grasp. > >You're right for users who indeed have this problem. But I am worried >about those users, which do not have the problem, but still have to know >what WeakReferences are...but I should wait for the RFC. > > >-- >PHP Internals - PHP Runtime Development Mailing List >To unsubscribe, visit: http://www.php.net/unsub.php >
Index: Zend/zend_builtin_functions.c =================================================================== --- Zend/zend_builtin_functions.c (revision 313122) +++ Zend/zend_builtin_functions.c (working copy) @@ -94,6 +94,7 @@ static ZEND_FUNCTION(gc_enabled); static ZEND_FUNCTION(gc_enable); static ZEND_FUNCTION(gc_disable); +static ZEND_FUNCTION(refcount); /* {{{ arginfo */ ZEND_BEGIN_ARG_INFO(arginfo_zend__void, 0) @@ -237,6 +238,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_extension_loaded, 0, 0, 1) ZEND_ARG_INFO(0, extension_name) ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_refcount, 0, 0, 0) + ZEND_ARG_INFO(0, object) +ZEND_END_ARG_INFO() /* }}} */ static const zend_function_entry builtin_functions[] = { /* {{{ */ @@ -306,6 +311,7 @@ ZEND_FE(gc_enabled, arginfo_zend__void) ZEND_FE(gc_enable, arginfo_zend__void) ZEND_FE(gc_disable, arginfo_zend__void) + ZEND_FE(refcount, arginfo_refcount) { NULL, NULL, NULL } }; /* }}} */ @@ -385,6 +391,19 @@ } /* }}} */ +/* {{{ proto int refcount(mixed value) + Returns the refcount for the passed object */ +ZEND_FUNCTION(refcount) +{ + zval *value; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &value) == FAILURE) { + return; + } + + RETURN_LONG(Z_REFCOUNT_P(value) - 1); +} + /* {{{ proto int func_num_args(void) Get the number of arguments that were passed to the function */ ZEND_FUNCTION(func_num_args)
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php