Bug #70733 [Com]: int/string conversion bug in arrays

From: Date: Sat, 28 Nov 2015 11:23:23 +0000
Subject: Bug #70733 [Com]: int/string conversion bug in arrays
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-197474@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=70733&edit=1 ID: 70733 Comment by: bfanger at gmail dot com Reported by: bfanger at gmail dot com Summary: int/string conversion bug in arrays Status: Open Type: Bug Package: Scripting Engine problem Operating System: El Capitan PHP Version: irrelevant Block user comment: N Private report: N New Comment: So the bug is even older, when you use (array) instead of get_object_vars() :-( Sound like an opportunity to fix it in PHP7 which suppose to have better types. ;-) I've found some workarounds make the following code work reliably across php versions: $data["200"] = false; Workaround 1: $data = unserialize(serialize((array) $object)); Workaround 2: $data = unserialize(serialize(get_object_vars($object))); Workaround 3: $data = json_decode(json_encode($object), true); Previous Comments: ------------------------------------------------------------------------ [2015-10-18 11:35:18] laruence@php.net that is get_object_vars now reuse the same array of the properties table of stdclass.. like: <?php $object = json_decode('{"200": true}'); $data = (array)($object); var_dump($data); $data['200'] = false; var_dump($data); echo json_encode($data, JSON_PRETTY_PRINT); this will result the same result both on php-5.6 and php7 :< ------------------------------------------------------------------------ [2015-10-18 09:29:39] bfanger at gmail dot com @laruence But the code snippet doesn't use integers anywhere, but php7 somehow decides to use the integer 200 instead of the given '200'. PHP 5.3, 5.3, 5.4, 5.5, 5.6 doesn't have this issue. ------------------------------------------------------------------------ [2015-10-18 07:19:48] laruence@php.net actually, this is not something new... because, there are string "200" and interge 200 in the same array. which is an knew issue. ------------------------------------------------------------------------ [2015-10-17 16:27:45] ab@php.net Reproduced even with 5.5. Thanks. ------------------------------------------------------------------------ [2015-10-17 15:43:16] bfanger at gmail dot com Description: ------------ Reading and writing to an array could lead to new array entries (with an integer key) instead of overwriting the value. This even leads weird json output using which uses same key twice, but that's an other issue. Test script: --------------- $object = json_decode('{"200": true}'); $data = get_object_vars($object); $data['200'] = false; echo json_encode($data, JSON_PRETTY_PRINT); Expected result: ---------------- { "200": false } Actual result: -------------- { "200": true, "200": false } ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=70733&edit=1

« previous php.bugs (#197474) next »