From: cschneid at cschneid dot com
Operating system:
PHP version: 6SVN-2009-10-16 (SVN)
PHP Bug Type: Feature/Change Request
Bug description: Strip $ at beginning of variable names for compact()
Description:
------------
One reason we are not using compact() in our production code is that it is
hard to search for variable references because $foo is simply called 'foo'
in compact()
Suggestion: Strip off a leading $ before looking up variables, i.e. make
compact('$foo') equivalent to compact('foo').
It's clear that people can shoot themselves in the foot if they try
compact("$foo") but it would possibly make code using compact() a little
easier to maintain.
Patch:
Index: ext/standard/array.c
===================================================================
--- ext/standard/array.c (revision 289696)
+++ ext/standard/array.c (working copy)
@@ -1488,7 +1488,7 @@
{
zstr key;
int key_len;
- zend_bool free_key = 0;
+ void *free_key = NULL;
zval **value_ptr, *value, *data;
if (Z_TYPE_P(entry) == IS_STRING || Z_TYPE_P(entry) == IS_UNICODE)
{
@@ -1505,9 +1505,19 @@
} else if (norm != key.u) {
key.u = norm;
key_len = norm_len;
- free_key = 1;
+ free_key = norm;
}
+ if (*key.u == '$') {
+ key.u++;
+ key_len--;
+ }
}
+ else {
+ if (*key.s == '$') {
+ key.s++;
+ key_len--;
+ }
+ }
if (zend_u_hash_find(eg_active_symbol_table,
Z_TYPE_P(entry), key, key_len + 1, (void **)&value_ptr) != FAILURE) {
value = *value_ptr;
ALLOC_ZVAL(data);
@@ -1518,7 +1528,7 @@
zend_u_hash_update(Z_ARRVAL_P(return_value),
Z_TYPE_P(entry), key, key_len + 1, &data, sizeof(zval *), NULL);
}
if (free_key) {
- efree(key.v);
+ efree(free_key);
}
}
else if (Z_TYPE_P(entry) == IS_ARRAY) {
Reproduce code:
---------------
sapi/cli/php -r '$foo = "FOO"; var_dump(compact("\$foo"));'
Expected result:
----------------
array(1) {
[u"foo"]=>
unicode(3) "FOO"
}
Actual result:
--------------
array(0) {
}
--
Edit bug report at http://bugs.php.net/?id=49903&edit=1
--
Try a snapshot (PHP 5.2):
http://bugs.php.net/fix.php?id=49903&r=trysnapshot52
Try a snapshot (PHP 5.3):
http://bugs.php.net/fix.php?id=49903&r=trysnapshot53
Try a snapshot (PHP 6.0):
http://bugs.php.net/fix.php?id=49903&r=trysnapshot60
Fixed in SVN:
http://bugs.php.net/fix.php?id=49903&r=fixed
Fixed in SVN and need be documented:
http://bugs.php.net/fix.php?id=49903&r=needdocs
Fixed in release:
http://bugs.php.net/fix.php?id=49903&r=alreadyfixed
Need backtrace:
http://bugs.php.net/fix.php?id=49903&r=needtrace
Need Reproduce Script:
http://bugs.php.net/fix.php?id=49903&r=needscript
Try newer version:
http://bugs.php.net/fix.php?id=49903&r=oldversion
Not developer issue:
http://bugs.php.net/fix.php?id=49903&r=support
Expected behavior:
http://bugs.php.net/fix.php?id=49903&r=notwrong
Not enough info:
http://bugs.php.net/fix.php?id=49903&r=notenoughinfo
Submitted twice:
http://bugs.php.net/fix.php?id=49903&r=submittedtwice
register_globals:
http://bugs.php.net/fix.php?id=49903&r=globals
PHP 4 support discontinued: http://bugs.php.net/fix.php?id=49903&r=php4
Daylight Savings: http://bugs.php.net/fix.php?id=49903&r=dst
IIS Stability:
http://bugs.php.net/fix.php?id=49903&r=isapi
Install GNU Sed:
http://bugs.php.net/fix.php?id=49903&r=gnused
Floating point limitations:
http://bugs.php.net/fix.php?id=49903&r=float
No Zend Extensions:
http://bugs.php.net/fix.php?id=49903&r=nozend
MySQL Configuration Error:
http://bugs.php.net/fix.php?id=49903&r=mysqlcfg