php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Request #71208 Array/Object cast should not loose numeric property/element accessibility
Submitted: 2015-12-23 23:50 UTC Modified: 2016-09-24 01:12 UTC
From: ajf@php.net Assigned: ajf (profile)
Status: Duplicate Package: Scripting Engine problem
PHP Version: 7.0.1 OS: OS X 10.11 El Capitan
Private report: No CVE-ID: None
 [2015-12-23 23:50 UTC] ajf@php.net
Description:
------------
If an array is casted to an object, its integer keys become inaccessible integer(!) key properties. They should be normal string key properties instead.

Test script:
---------------
<?php

$arr = [1, 2, 4];
$obj = (object)$arr;

var_dump($obj);
var_dump($obj->{1}, $obj->{2}, $obj->{3});
var_dump($obj->{'1'}, $obj->{'2'}, $obj->{'3'});

?>

Expected result:
----------------
object(stdClass)#1 (3) {
  ["0"]=>
  int(1)
  ["1"]=>
  int(2)
  ["2"]=>
  int(4)
}
int(1)
int(2)
int(4)
int(1)
int(2)
int(4)

Actual result:
--------------
object(stdClass)#1 (3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(4)
}

Notice: Undefined property: stdClass::$1 in - on line 7

Notice: Undefined property: stdClass::$2 in - on line 7

Notice: Undefined property: stdClass::$3 in - on line 7

NULL
NULL
NULL

Notice: Undefined property: stdClass::$1 in - on line 8

Notice: Undefined property: stdClass::$2 in - on line 8

Notice: Undefined property: stdClass::$3 in - on line 8

NULL
NULL
NULL

Patches

Pull Requests

Pull requests:

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2015-12-23 23:51 UTC] ajf@php.net
-Status: Open +Status: Assigned -Assigned To: +Assigned To: ajf
 [2015-12-23 23:52 UTC] ajf@php.net
This has been broken since at least PHP 5.4.
 [2015-12-23 23:52 UTC] ajf@php.net
-Summary: Array/Object cast looses numeric property/element accessibility +Summary: Array/Object cast loses numeric property/element accessibility
 [2015-12-24 01:01 UTC] ajf@php.net
Er, the test script has an off-by-one error. It should be:

<?php

$arr = [1, 2, 4];
$obj = (object)$arr;

var_dump($obj);
var_dump($obj->{0}, $obj->{1}, $obj->{2});
var_dump($obj->{'0'}, $obj->{'1'}, $obj->{'2'});

?>
 [2016-08-08 12:17 UTC] cmb@php.net
-Summary: Array/Object cast loses numeric property/element accessibility +Summary: Array/Object cast should not loose numeric property/element accessibility
 [2016-08-08 12:17 UTC] cmb@php.net
For the record: this issue had already been reported as bug
#53838, which had been suspended, and as bug #61655, which has
been marked as not-a-bug, because of performance issues.

So that's probably something that would have to be discussed on
internals, if that hadn't already happened.

> This has been broken since at least PHP 5.4.

It behaves this way as of PHP 5.0.0, and didn't work earlier at
all, see <https://3v4l.org/55kiC>.
 [2016-08-08 12:18 UTC] cmb@php.net
-Type: Bug +Type: Feature/Change Request
 [2016-08-12 12:24 UTC] cmb@php.net
-Status: Assigned +Status: Duplicate
 [2016-08-12 12:24 UTC] cmb@php.net
Well, actually this is a duplicate of bug #66173.
 [2016-09-24 01:12 UTC] ajf@php.net
It's not a duplicate of bug #66173, it's a deliberate counterpart to it.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Tue Dec 03 17:01:29 2024 UTC