#46600 [Com]: "_empty_" key in objects (see #41504)
ID: 46600 Comment by: matt at mpcm dot com Reported By: Matt at mpcm dot com Status: Feedback Bug Type: JSON related Operating System: * PHP Version: 5CVS, 6CVS (2008-11-18) New Comment: A note about this in the json_decode page would be appreciated. Perhaps a strict mode flag, so that it can fail if it cannot be decoded as an object (?). For the moment the only safe way to decode json is into arrays. The _empty_ behavior I thought was a bug (as it was with arrays) is a required behavior for objects (at least without __get && __set in a wrapper class). The bugs that jump out at me now can be seen with the code below... you can create objects with unreachable properties. If that blank property access is fixed, then this becomes not so much of an issue. Or it should be stopped from ever happening... silent errors bite us all. Illegal Member variable name if var_dump does it, fatal if a user does it. Notice: PHPDocument1 line 8 - Illegal member variable name 1234, 'some other key'=>5678, $another=>); $b = (object) $a; $c = json_decode(json_encode($a)); var_dump($b); var_dump($c); #echo $b->$blank; //fatal echo $b->$another; //works #echo $c->$blank; //fatal echo $c->$another; //works ?> Previous Comments: [2008-12-18 03:27:25] scott...@php.net I'm not even sure what the bug is? You can't have an empty property name hence the use of "_empty_". The key collision thing is a very edge case, are you saying you ran into this in a real life usage? The best course of action may be to have this documented on the json_encode() and json_decode() pages. ---------------- [2008-12-04 20:39:13] Matt at mpcm dot com Thanx for the reply magicaltux, `Feature` is an interesting word considering the possible key collision. There are other ways to get things that are not strictly objects to behave that way. Overloading (like example #1 at http://us.php.net/manual/en/language.oop5.overloading.php). It works well enough as long as you also make it iterate correctly. What I am suggesting is that it is better to fail in decoding into an object, than to silently cause a key collision. Or alternatively, produce an overloaded object which can have these keys (by default, or passed optional flag) from json_decode. It's an opinion, but a wrapper gets me where I need to be for now, and I'm pretty sure this is an edge case. $a = '{"":"a","_empty_":"b"}'; echo json_encode(json_decode($a)); echo json_encode(json_decode($a, true)); output: {"_empty_":"b"} {"":"a","_empty_":"b"} for some values: $a != json_encode(json_decode($a)); [2008-12-04 10:44:29] magical...@php.net I believe this is not a bug, but a feature. An object *can't* have an empty property (while an array can). If you want to use json_decode() with json containing empty key, either access those empty key using special keyword "_empty_", or put the optionnal $assoc parameter of json_decode() to true to get result as an array. If you want objects to support empty keys, I believe this is not going to happen soon, as this is enforced by a specific error message. Fatal error: Cannot access empty property in php shell code on line 1 Please note that a property name starting with NULL character won't work either. [2008-11-18 17:35:30] matt at mpcm dot com The language seems to create a key that cannot be reached, so even if this `bug` is fixed, we am still facing a broader issue it seems. 4,"example"=>8); var_dump($o); print 'blank key test:' . (isset($o->$key)?'true':'false'); print $o->{$key}; var_dump($o->$key); ?> output: object(stdClass)#1 (2) { [""]=> int(4) ["example"]=> int(8) } blank key test:false Fatal error: Cannot access empty property in PHPDocument1 on line 8 All throws Notice: line 4 - Illegal member variable name [2008-11-18 15:43:05] matt at mpcm dot com All the work arounds I am looking at are throwing Error Text: Illegal member variable name when I convert/cast an object with a blank property. Is this json_decode `bug` a result of a larger object mechanism limitation inside of php's object handling? The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at http://bugs.php.net/46600 -- Edit this bug report at http://bugs.php.net/?id=46600&edit=1
#46600 [Ver]: "_empty_" key in objects (see #41504)
ID: 46600 User updated by: Matt at mpcm dot com Reported By: Matt at mpcm dot com Status: Verified Bug Type: JSON related Operating System: * PHP Version: 5CVS, 6CVS (2008-11-18) New Comment: Thanx for the reply magicaltux, `Feature` is an interesting word considering the possible key collision. There are other ways to get things that are not strictly objects to behave that way. Overloading (like example #1 at http://us.php.net/manual/en/language.oop5.overloading.php). It works well enough as long as you also make it iterate correctly. What I am suggesting is that it is better to fail in decoding into an object, than to silently cause a key collision. Or alternatively, produce an overloaded object which can have these keys (by default, or passed optional flag) from json_decode. It's an opinion, but a wrapper gets me where I need to be for now, and I'm pretty sure this is an edge case. $a = '{"":"a","_empty_":"b"}'; echo json_encode(json_decode($a)); echo json_encode(json_decode($a, true)); output: {"_empty_":"b"} {"":"a","_empty_":"b"} for some values: $a != json_encode(json_decode($a)); Previous Comments: [2008-12-04 10:44:29] [EMAIL PROTECTED] I believe this is not a bug, but a feature. An object *can't* have an empty property (while an array can). If you want to use json_decode() with json containing empty key, either access those empty key using special keyword "_empty_", or put the optionnal $assoc parameter of json_decode() to true to get result as an array. If you want objects to support empty keys, I believe this is not going to happen soon, as this is enforced by a specific error message. Fatal error: Cannot access empty property in php shell code on line 1 Please note that a property name starting with NULL character won't work either. [2008-11-18 17:35:30] matt at mpcm dot com The language seems to create a key that cannot be reached, so even if this `bug` is fixed, we am still facing a broader issue it seems. 4,"example"=>8); var_dump($o); print 'blank key test:' . (isset($o->$key)?'true':'false'); print $o->{$key}; var_dump($o->$key); ?> output: object(stdClass)#1 (2) { [""]=> int(4) ["example"]=> int(8) } blank key test:false Fatal error: Cannot access empty property in PHPDocument1 on line 8 All throws Notice: line 4 - Illegal member variable name [2008-11-18 15:43:05] matt at mpcm dot com All the work arounds I am looking at are throwing Error Text: Illegal member variable name when I convert/cast an object with a blank property. Is this json_decode `bug` a result of a larger object mechanism limitation inside of php's object handling? [2008-11-18 03:13:51] Matt at mpcm dot com Description: json_decode() treats empty property name as "_empty_" not "". This was fixed in #41504 for arrays, but not for objects. (seems to happen in PHP Version 5.2.4-2ubuntu5.3 and 5.3.0alpha2. Reproduce code: --- Expected result: object(stdClass)#1 (1) { [""]=> string(4) "test" } Actual result: -- object(stdClass)#2 (1) { ["_empty_"]=> string(4) "test" } -- Edit this bug report at http://bugs.php.net/?id=46600&edit=1
#46600 [Com]: "_empty_" key in objects (see #41504)
ID: 46600 Comment by: matt at mpcm dot com Reported By: Matt at mpcm dot com Status: Verified Bug Type: JSON related Operating System: * PHP Version: 5CVS, 6CVS (2008-11-18) New Comment: The language seems to create a key that cannot be reached, so even if this `bug` is fixed, we am still facing a broader issue it seems. 4,"example"=>8); var_dump($o); print 'blank key test:' . (isset($o->$key)?'true':'false'); print $o->{$key}; var_dump($o->$key); ?> output: object(stdClass)#1 (2) { [""]=> int(4) ["example"]=> int(8) } blank key test:false Fatal error: Cannot access empty property in PHPDocument1 on line 8 All throws Notice: line 4 - Illegal member variable name Previous Comments: ---------------- [2008-11-18 15:43:05] matt at mpcm dot com All the work arounds I am looking at are throwing Error Text: Illegal member variable name when I convert/cast an object with a blank property. Is this json_decode `bug` a result of a larger object mechanism limitation inside of php's object handling? ---------------- [2008-11-18 03:13:51] Matt at mpcm dot com Description: json_decode() treats empty property name as "_empty_" not "". This was fixed in #41504 for arrays, but not for objects. (seems to happen in PHP Version 5.2.4-2ubuntu5.3 and 5.3.0alpha2. Reproduce code: --- Expected result: object(stdClass)#1 (1) { [""]=> string(4) "test" } Actual result: -- object(stdClass)#2 (1) { ["_empty_"]=> string(4) "test" } -- Edit this bug report at http://bugs.php.net/?id=46600&edit=1
#46600 [Com]: "_empty_" key in objects (see #41504)
ID: 46600 Comment by: matt at mpcm dot com Reported By: Matt at mpcm dot com Status: Verified Bug Type: JSON related Operating System: * PHP Version: 5CVS, 6CVS (2008-11-18) New Comment: All the work arounds I am looking at are throwing Error Text: Illegal member variable name when I convert/cast an object with a blank property. Is this json_decode `bug` a result of a larger object mechanism limitation inside of php's object handling? Previous Comments: [2008-11-18 03:13:51] Matt at mpcm dot com Description: json_decode() treats empty property name as "_empty_" not "". This was fixed in #41504 for arrays, but not for objects. (seems to happen in PHP Version 5.2.4-2ubuntu5.3 and 5.3.0alpha2. Reproduce code: --- Expected result: object(stdClass)#1 (1) { [""]=> string(4) "test" } Actual result: -- object(stdClass)#2 (1) { ["_empty_"]=> string(4) "test" } -- Edit this bug report at http://bugs.php.net/?id=46600&edit=1
#46600 [NEW]: "_empty_" key in objects (see #41504)
From: Matt at mpcm dot com Operating system: Ubuntu PHP version: 5.3.0alpha2 PHP Bug Type: JSON related Bug description: "_empty_" key in objects (see #41504) Description: json_decode() treats empty property name as "_empty_" not "". This was fixed in #41504 for arrays, but not for objects. (seems to happen in PHP Version 5.2.4-2ubuntu5.3 and 5.3.0alpha2. Reproduce code: --- Expected result: object(stdClass)#1 (1) { [""]=> string(4) "test" } Actual result: -- object(stdClass)#2 (1) { ["_empty_"]=> string(4) "test" } -- Edit bug report at http://bugs.php.net/?id=46600&edit=1 -- Try a CVS snapshot (PHP 5.2): http://bugs.php.net/fix.php?id=46600&r=trysnapshot52 Try a CVS snapshot (PHP 5.3): http://bugs.php.net/fix.php?id=46600&r=trysnapshot53 Try a CVS snapshot (PHP 6.0): http://bugs.php.net/fix.php?id=46600&r=trysnapshot60 Fixed in CVS: http://bugs.php.net/fix.php?id=46600&r=fixedcvs Fixed in CVS and need be documented: http://bugs.php.net/fix.php?id=46600&r=needdocs Fixed in release: http://bugs.php.net/fix.php?id=46600&r=alreadyfixed Need backtrace: http://bugs.php.net/fix.php?id=46600&r=needtrace Need Reproduce Script: http://bugs.php.net/fix.php?id=46600&r=needscript Try newer version: http://bugs.php.net/fix.php?id=46600&r=oldversion Not developer issue: http://bugs.php.net/fix.php?id=46600&r=support Expected behavior: http://bugs.php.net/fix.php?id=46600&r=notwrong Not enough info: http://bugs.php.net/fix.php?id=46600&r=notenoughinfo Submitted twice: http://bugs.php.net/fix.php?id=46600&r=submittedtwice register_globals: http://bugs.php.net/fix.php?id=46600&r=globals PHP 4 support discontinued: http://bugs.php.net/fix.php?id=46600&r=php4 Daylight Savings:http://bugs.php.net/fix.php?id=46600&r=dst IIS Stability: http://bugs.php.net/fix.php?id=46600&r=isapi Install GNU Sed: http://bugs.php.net/fix.php?id=46600&r=gnused Floating point limitations: http://bugs.php.net/fix.php?id=46600&r=float No Zend Extensions: http://bugs.php.net/fix.php?id=46600&r=nozend MySQL Configuration Error: http://bugs.php.net/fix.php?id=46600&r=mysqlcfg