php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #80380 Cannot access numeric property in ArrayObject
Submitted: 2020-11-19 09:33 UTC Modified: 2020-11-23 18:26 UTC
Votes:1
Avg. Score:3.0 ± 0.0
Reproduced:0 of 0 (0.0%)
From: anton at rudnikov dot net Assigned:
Status: Verified Package: SPL related
PHP Version: 7.4.12 OS: any
Private report: No CVE-ID: None
View Add Comment Developer Edit
Anyone can comment on a bug. Have a simpler test case? Does it work for you on a different platform? Let us know!
Just going to say 'Me too!'? Don't clutter the database with that please — but make sure to vote on the bug!
Your email address:
MUST BE VALID
Solve the problem:
45 - 19 = ?
Subscribe to this entry?

 
 [2020-11-19 09:33 UTC] anton at rudnikov dot net
Description:
------------
I pass an object to ArrayObject constructor, and trying to access its properties. I can access string properties, but I can't access numeric one

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

$object = new stdClass;
$object->prop = 'test1';
$object->{'1'} = 'test2';

$arrayObject = new ArrayObject($object);
echo $arrayObject['prop']; // test1              
echo $arrayObject['1']; // Undefined index

$arrayObject = new ArrayObject($object, ArrayObject::ARRAY_AS_PROPS);
echo $arrayObject->prop; // test1              
echo $arrayObject->{'1'}; // Undefined index

Expected result:
----------------
test1
test2
test1
test2

Actual result:
--------------
test1
Notice: Undefined index: 1 in /in/9UdHs on line 9
test1
Notice: Undefined index: 1 in /in/9UdHs on line 13

Patches

Add a Patch

Pull Requests

Pull requests:

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2020-11-19 09:42 UTC] anton at rudnikov dot net
-Package: *Programming Data Structures +Package: SPL related
 [2020-11-19 09:42 UTC] anton at rudnikov dot net
Changed package
 [2020-11-19 11:34 UTC] cmb@php.net
-Status: Open +Status: Verified -Assigned To: +Assigned To: cmb
 [2020-11-19 11:34 UTC] cmb@php.net
Given that numeric properties are accessible after array
conversion as of PHP 7.2.0, it seems wrong that this is not the
case with ArrayObjects.
 [2020-11-19 12:32 UTC] cmb@php.net
The following pull request has been associated:

Patch Name: Fix #80380: Cannot access numeric property in ArrayObject
On GitHub:  https://github.com/php/php-src/pull/6436
Patch:      https://github.com/php/php-src/pull/6436.patch
 [2020-11-20 08:17 UTC] anton at rudnikov dot net
There's also interesting behaviour when I try to get array copy from ArrayObject using method getArrayCopy.

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

$object = new stdClass();
$object->prop = 'test1';
$object->{'1'} = 'test2';

$arrayObject = new ArrayObject($object);
$arrayCopy = $arrayObject->getArrayCopy();
var_dump($arrayCopy[1], $arrayCopy['1']); // can't access numeric property on array copy

$array = (array) $object;
var_dump($array[1], $array['1']); // but it works if I just cast stdClass to array

var_dump($arrayCopy, $array); // let's see differences between arrays

Actual result:
--------------
Notice: Undefined offset: 1 in /tmp/preview on line 8

Notice: Undefined offset: 1 in /tmp/preview on line 8
NULL
NULL
string(4) "test"
string(4) "test"
array(1) {
  ["1"]=>
  string(4) "test"
}
array(1) {
  [1]=>
  string(4) "test"
}
 [2020-11-23 18:26 UTC] cmb@php.net
-Assigned To: cmb +Assigned To:
 [2020-11-23 18:26 UTC] cmb@php.net
Yes, that is another instance of the same root cause, which is
that ArrayObject treats object properties ("proptables") as arrays
("symtables").  Yet another instance:

<?php
$object = new stdClass;
$object->{'1'} = 'test1';

$arrayObject = new ArrayObject($object);
$arrayObject['2'] = 'test2';

var_dump($object);
?>

We have just created an inaccessible numeric property on the
stdClass instance.

It seems to me that the fix is not trivial, and that it might
break some existing code.  As such, I don't think this should
be fixed for any stable PHP version, but rather documented.
 [2022-12-31 06:44 UTC] BethanyShaw at teleworm dot us
Access property of object array In this JavaScript Program, we have access to the property of Empname and used the Map function to get the values of this property.The array.map () method is iterated over the element of the array and modifies elements of the array by applying some function and returning the modified element as a new array. 3.

<https://www.dmvnow.us/>github.com
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Fri Apr 19 15:01:28 2024 UTC