Edit report at https://bugs.php.net/bug.php?id=41727&edit=1
ID: 41727 Updated by: s...@php.net Reported by: dan at yes dot lt Summary: ArrayAccess::offsetExists works wrong with isset() Status: Bogus Type: Bug Package: SPL related Operating System: WinXP PHP Version: 5.2.3 Block user comment: N Private report: N New Comment: What prevents you from implementing offsetExists with any checks you like, including null check? Previous Comments: ------------------------------------------------------------------------ [2007-06-22 10:35:20] dan at yes dot lt I see... you make php for yourself, but not for others... you don't listen for arguments, just skipping the bugs... without any reason explanations... thank you for good support and correct php! ------------------------------------------------------------------------ [2007-06-22 10:29:15] johan...@php.net . ------------------------------------------------------------------------ [2007-06-22 07:46:23] dan at yes dot lt ok, now think... if you have method to work with array or any object with ArrayAccess implemented... function some($list) { if (isset($list[0])) { // do something with $list[0] return true; } else { // no $list[0] defined, skipping return false; } } user, who implements this function must not know the real type of the $list variable - but only that this variable can be accessed as array... now - if $list = array(0 => null), then this function works correctly, but if $list = new ArrayObject(array(0 => null)), then it fails... now, you say, i must to use offsetGet method... then, i must check whether $list is instance of ArrayAccess, then add complex checkings using offsetExists and offsetGet... was the ArrayAccess realy planned to be such a silly structure to use it in such complex way?.. I don't think so. I still think, isset() must automaticaly call offsetGet after offsetExists returns true... ------------------------------------------------------------------------ [2007-06-22 07:34:01] johan...@php.net Yes, I still think so. ------------------------------------------------------------------------ [2007-06-22 04:38:24] dan at yes dot lt isset Determine whether a variable is set [http://php.net/isset] array_key_exists Checks if the given key or index exists in the array [http://php.net/array-key-exists] <?php $a = array(0 => 10, 1 => null); // so... var_dump(isset($a[0])); // bool(true) var_dump(array_key_exists(0, $a)); // bool(true) // but... var_dump(isset($a[1])); // bool(false) var_dump(array_key_exists(0, $a)); // bool(true) ?> now... ArrayObject::offsetExists Returns whether the requested $index exists [http://php.net/ArrayObject-offsetExists] so, offsetExists must return the same as array_key_exists... but how isset() must work with ArrayAccess?.. <?php $a = new ArrayObject(array(0 => 10, 1 => null)); // so... var_dump(isset($a[0])); // bool(true) var_dump($a->offsetExists(0)); // bool(true) var_dump(array_key_exists(0, $a)); // bool(true) // but... var_dump(isset($a[1])); // bool(true) | false expected var_dump($a->offsetExists(1)); // bool(true) var_dump(array_key_exists(1, $a)); // bool(true) ?> in this case isset() returns true, but obviously must return false... don't you think so?.. isn't this situation silly?.. and do you still think - "this is not a bug"?.. ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at https://bugs.php.net/bug.php?id=41727 -- Edit this bug report at https://bugs.php.net/bug.php?id=41727&edit=1