Bug #51682 [Com]: (array) casting and numeric keys

From: Date: Wed, 28 Apr 2010 20:55:10 +0000
Subject: Bug #51682 [Com]: (array) casting and numeric keys
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-150012@lists.php.net to get a copy of this message
Edit report at http://bugs.php.net/bug.php?id=51682&edit=1

 ID:          51682
 Comment by:  ptacek dot pavel at gmail dot com
 Reported by: david at grudl dot com
 Summary:     (array) casting and numeric keys
 Status:      Open
 Type:        Bug
 Package:     Arrays related
 PHP Version: Irrelevant

 New Comment:

Test 1: 
--------
class Test {
    protected $25twentyFive;
}

Expected result: Parse error.
Actual result: Parse error.

Test 2:
--------
$obj = new stdClass;
$obj->{25} = 'test assign as-integer';

$arr = (array) $obj;
$arr[25] = 'test assign into array, with integer';

var_dump($arr);

Expected result 2:
-------------------
Parse error (since numeric variables are not compliant; when doing
$obj->25 i 
get an parse error)

Actual result 2:
-----------------
array(2) {
  ["25"]=>
  string(22) "test assign as-integer"
  [25]=>
  string(36) "test assign into array, with integer"
}

Test 3:
--------
$obj = new stdClass;
$twentyFive = 25;
$obj->$twentyFive = 'test assing with integer';

$arr = (array) $obj;
$arr[$twentyFive] = 'test assign into array';

var_dump($arr);

Expected result 3:
-------------------
array(1) {
  [25]=>
  string(22) "test assign into array"
}

OR notice.

Actual result 3:
-----------------
array(2) {
  ["25"]=>
  string(24) "test assing with integer"
  [25]=>
  string(22) "test assign into array"
}

Proposed solution:
-------------------
When doing:
    $twentyFive = 25;
    $obj->$twentyFive = 'some string';

php should raise a notice


When doing:
    $obj->{25} = 'some string';

php should raise an error.


Previous Comments:
------------------------------------------------------------------------
[2010-04-28 17:04:03] pavel dot lisa at centrum dot cz

I'd say there is no error in the way PHP handles this, as you are
accessing 
$obj->{'10'} by a string key ( '10' === "10" => true ). 

$obj = new stdClass;
$obj->{"10"} = 'as string';

$arr = (array) $obj;
$arr["10"] = 'as string again';

var_dump($arr);

would then produce something like

array(1) {
  ["10"]=>
  string(10) "as string again"
}

------------------------------------------------------------------------
[2010-04-28 15:30:25] david at grudl dot com

Description:
------------
Casting to (array) handles numeric keys wrong way:



Test script:
---------------
$obj = new stdClass;
$obj->{'10'} = 'as string';

$arr = (array) $obj;
$arr[10] = 'as integer';

var_dump($arr);


Expected result:
----------------
array(1) {
  [10]=>
  string(10) "as integer"
}



Actual result:
--------------
array(2) {
  ["10"]=>
  string(9) "as string"
  [10]=>
  string(10) "as integer"
}




------------------------------------------------------------------------



-- 
Edit this bug report at http://bugs.php.net/bug.php?id=51682&edit=1


Thread (4 messages)

« previous php.bugs (#150012) next »