Req #52215 [Com]: Add var_ref_count()
Edit report at https://bugs.php.net/bug.php?id=52215&edit=1
ID: 52215
Comment by: chrisw at networkm dot co dot uk
Reported by: dev at alepe dot com
Summary: Add var_ref_count()
Status: Open
Type: Feature/Change Request
Package: Variables related
Operating System: Any
PHP Version: 5.3.3RC1
Block user comment: N
Private report: N
New Comment:
The problem (such as it is) that this issue creates is larger in PHP 5.4. Because
call-time pass by reference now causes a fatal error, debug_zval_dump() is now
completely pointless (the data it can provide can obtained from var_dump()).
Either it should be removed and something like var_ref_count() should be added, or
it should be altered to take it's argument by reference.
Previous Comments:
------------------------------------------------------------------------
[2011-05-09 19:07:17] thegreatall at gmail dot com
I recently wrote a simple modification to the php source, which returns the
number of references linked to a variable. It does suffer from the same problem
that debug_zval_dump suffers from, but it is simply always +1 than what you
expect. Aadding a note in the documentation saying "The value will always be 1
more than the actual reference count." or just -1 from the returned value should
work.
If there's even a chance that this would be reviewed and possibly added into
php's source, I would be happy to make a patch for it. This function may not
seem critical, but I developed a framework that does allot of class recycling
and it would be nice to have the ability to figure out what variables it can
release, and a function like this or what I wrote would be HUGE in terms of
memory management. A conversion script I wrote uses upwards of 1-3 gigs of ram
if I recycle variables, but I could reduce that number to <10 megs if I could
figure out what variables are free'able. The workaround I have to work with now
is to either "guess" what isn't being used (which is almost always wrong) or to
not use any object recycling which is alot slower because it needs to initiate a
new object every time, and you can have 2 different objects to the same data
(which the huge downside to it is that there can be 2 objects for the same
record/data).
------------------------------------------------------------------------
[2010-07-01 13:44:40] derick@php.net
This won't work, for the same reason that debug_zval_dump() is flawed. By passing a variable to
a function, you mess with the refcount/is_ref values. Xdebug's xdebug_debug_zval()
(http://xdebug.org/docs/all_functions#xdebug_debug_zval) goes around that by looking up the symbol
directly (but it doesn't support array elements directly).
------------------------------------------------------------------------
[2010-07-01 03:49:32] dtajchreber@php.net
http://www.php.net/manual/en/function.debug-zval-dump.php
------------------------------------------------------------------------
[2010-07-01 03:34:42] dev at alepe dot com
Please excuse me if I have some theoretical misconceptions or if my English is not very good.
------------------------------------------------------------------------
[2010-07-01 03:33:03] dev at alepe dot com
Description:
------------
It seems there is no easy way to know if an object/array/... is reference.
Looking at the source code of ext/standard/var.c it seems it may be not so hard to add that
function. As debug_zval_dump already outputs the reference count, it would be better to obtain that
value in order to determine if an object is referenced or not. Maybe something like (I'm not C
programmer):
PHPAPI void php_var_ref_count(zval **struc)
{
return Z_REFCOUNT_PP(struc);
}
Knowing the reference count may be helpful to:
- make copies of a structure without references
- remove variables that have more than 1 reference (safe remove)
- remove variables that are not referenced (unused values)
- prevent modifying a variable that is referenced
I believe there must be more applications but these are the ones I can think of.
(background: http://stackoverflow.com/questions/3148125/php-check-if-object-array-is-a-reference)
Test script:
---------------
<?php
$en = array("a" => "apple", "b" => "banana");
$es = array("a" => "manzana", "b" => "platano");
$dict = array(
"Eng" => $en,
"Esp" => $es,
"Non" => array("a" => "A", "b" => "B")
);
echo var_ref_count($dict["Eng"]);
echo " # ";
echo var_ref_count($dict["Non"]);
?>
Expected result:
----------------
2 # 1
Actual result:
--------------
None (inexistent)
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=52215&edit=1
Thread (8 messages)