Bug #80380 [Ver]: Cannot access numeric property in ArrayObject

From: Date: Mon, 23 Nov 2020 18:26:52 +0000
Subject: Bug #80380 [Ver]: Cannot access numeric property in ArrayObject
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-230548@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=80380&edit=1

 ID:                 80380
 Updated by:         cmb@php.net
 Reported by:        anton at rudnikov dot net
 Summary:            Cannot access numeric property in ArrayObject
 Status:             Verified
 Type:               Bug
 Package:            SPL related
 Operating System:   any
 PHP Version:        7.4.12
-Assigned To:        cmb
+Assigned To:        
 Block user comment: N
 Private report:     N

 New Comment:

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.


Previous Comments:
------------------------------------------------------------------------
[2020-11-20 08:17:34] 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-19 12:32:08] 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-19 11:34:02] 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 09:42:17] anton at rudnikov dot net

Changed package

------------------------------------------------------------------------
[2020-11-19 09:33:57] 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


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



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


Thread (8 messages)

« previous php.bugs (#230548) next »