From: marcus at synchromedia dot co dot uk Operating system: All PHP version: 5.1.6 PHP Bug Type: Class/Object related Bug description: Strange results or object to array cast
Description: ------------ When you cast an object to an array, and the object contains private or protected members, the resulting array keys are effectively corrupted. Private members get the object class prepended to their name. Protected members get a '*' prepended to their name. The docs say: "If you convert an object to an array, you get the properties (member variables) of that object as the array's elements. The keys are the member variable names." In reality, this is not true. I don't see any real value in preserving access levels - arrays are not objects and they should not try to behave as them. You can find out the access level via introspection if you really need it, and by definition you have an instance handy to look at. If it's intentional, it's not very helpful. As there's no separator between class name and variable name it's impossible to separate it correctly - if I had a property called 'Myclassfield1' in a Myclass instance, I would not be able to tell if it was a public property called 'Myclassfield1' or a private property called 'field1'. As this is deviating from documented behaviour and it's also fairly useless as it stands, I don't see any reason for keeping it like this. Reproduce code: --------------- <?php class Myclass { public $field1 = ''; private $field2 = ''; protected $field3 = ''; } $myclass = new Myclass; var_dump($myclass); var_dump((array)$myclass); ?> Expected result: ---------------- object(Myclass)#1 (3) { ["field1"]=> string(0) "" ["field2:private"]=> string(0) "" ["field3:protected"]=> string(0) "" } array(3) { ["field1"]=> string(0) "" ["field2"]=> string(0) "" ["field3"]=> string(0) "" } Actual result: -------------- object(Myclass)#1 (3) { ["field1"]=> string(0) "" ["field2:private"]=> string(0) "" ["field3:protected"]=> string(0) "" } array(3) { ["field1"]=> string(0) "" ["Myclassfield2"]=> string(0) "" ["*field3"]=> string(0) "" } -- Edit bug report at http://bugs.php.net/?id=38935&edit=1 -- Try a CVS snapshot (PHP 4.4): http://bugs.php.net/fix.php?id=38935&r=trysnapshot44 Try a CVS snapshot (PHP 5.2): http://bugs.php.net/fix.php?id=38935&r=trysnapshot52 Try a CVS snapshot (PHP 6.0): http://bugs.php.net/fix.php?id=38935&r=trysnapshot60 Fixed in CVS: http://bugs.php.net/fix.php?id=38935&r=fixedcvs Fixed in release: http://bugs.php.net/fix.php?id=38935&r=alreadyfixed Need backtrace: http://bugs.php.net/fix.php?id=38935&r=needtrace Need Reproduce Script: http://bugs.php.net/fix.php?id=38935&r=needscript Try newer version: http://bugs.php.net/fix.php?id=38935&r=oldversion Not developer issue: http://bugs.php.net/fix.php?id=38935&r=support Expected behavior: http://bugs.php.net/fix.php?id=38935&r=notwrong Not enough info: http://bugs.php.net/fix.php?id=38935&r=notenoughinfo Submitted twice: http://bugs.php.net/fix.php?id=38935&r=submittedtwice register_globals: http://bugs.php.net/fix.php?id=38935&r=globals PHP 3 support discontinued: http://bugs.php.net/fix.php?id=38935&r=php3 Daylight Savings: http://bugs.php.net/fix.php?id=38935&r=dst IIS Stability: http://bugs.php.net/fix.php?id=38935&r=isapi Install GNU Sed: http://bugs.php.net/fix.php?id=38935&r=gnused Floating point limitations: http://bugs.php.net/fix.php?id=38935&r=float No Zend Extensions: http://bugs.php.net/fix.php?id=38935&r=nozend MySQL Configuration Error: http://bugs.php.net/fix.php?id=38935&r=mysqlcfg