#46600 [Ver]: _empty_ key in objects (see #41504)

2008-12-17 Thread scottmac
 ID:   46600
 Updated by:   scott...@php.net
 Reported By:  Matt at mpcm dot com
 Status:   Verified
 Bug Type: JSON related
 Operating System: *
 PHP Version:  5CVS, 6CVS (2008-11-18)
 New Comment:

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.


Previous Comments:


[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.

?
$key = ;
$o = (object) array($key=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:falsebr /
bFatal error/b:  Cannot access empty property in
bPHPDocument1/b on line b8/bbr /
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:
---
?
$s = '{:test}';
var_dump(json_decode($s));
?


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=46600edit=1



#46600 [Ver]: _empty_ key in objects (see #41504)

2008-12-04 Thread magicaltux
 ID:   46600
 Updated by:   [EMAIL PROTECTED]
 Reported By:  Matt at mpcm dot com
 Status:   Verified
 Bug Type: JSON related
 Operating System: *
 PHP Version:  5CVS, 6CVS (2008-11-18)
 New Comment:

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.


Previous Comments:


[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.

?
$key = ;
$o = (object) array($key=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:falsebr /
bFatal error/b:  Cannot access empty property in
bPHPDocument1/b on line b8/bbr /
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:
---
?
$s = '{:test}';
var_dump(json_decode($s));
?


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=46600edit=1



#46600 [Ver]: _empty_ key in objects (see #41504)

2008-12-04 Thread Matt at mpcm dot com
 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.

?
$key = ;
$o = (object) array($key=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:falsebr /
bFatal error/b:  Cannot access empty property in
bPHPDocument1/b on line b8/bbr /
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:
---
?
$s = '{:test}';
var_dump(json_decode($s));
?


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=46600edit=1