Edit report at https://bugs.php.net/bug.php?id=34849&edit=1
ID: 34849
Comment by: jon at phpsitesolutions dot com
Reported by: tschundler at gmail dot com
Summary: array_key_exists and isset misbehavior with
ArrayAccess
Status: Bogus
Type: Bug
Package: Arrays related
Operating System: *
PHP Version: 5.*
Block user comment: N
Private report: N
New Comment:
That's ridiculous, that ArrayAccess doesn't work with PHP's own array_*
functions.
If that's the case, why provide ArrayAccess as an SPL class?
You'd think that SPL classes would have full functionality with native PHP, yet
because someone was apparently lazy during implementation, it doesn't.
And so of course, 6 years later, this is still an issue that has not been
rectified.
Now I see why PHP has such a bad reputation when compared against other quality
languages...
Previous Comments:
------------------------------------------------------------------------
[2005-10-13 08:24:01] [email protected]
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php
ArrayAccess objects don't work in array_*() functions. You may want to turn
this report into a feature request?
------------------------------------------------------------------------
[2005-10-13 06:56:36] tschundler at gmail dot com
Description:
------------
Functions to test an array's content don't work consistently with ArrayAccess
objects.
In the example, the object will return TRUE a request for any key. But,
array_key_exists always returns FALSE, seemingly testing nothing, when it
should be using the offsetExists method.
Additionally, isset() on an array will return FALSE if the value at that offset
is NULL. But with an ArrayAccess object, it returns TRUE, using the
offsetExists method.
Reproduce code:
---------------
class ArrayTest implements ArrayAccess {
function offsetExists ($offset) {return TRUE;}
function offsetGet ($offset) {return ($offset==0) ? NULL : $offset;}
function offsetSet ($offset, $value) {}
function offsetUnset ($offset) {}
}
echo "with ArrayAcces:\n";
$x=new ArrayTest();
var_dump(array_key_exists(0,$x));
var_dump(array_key_exists(1,$x));
var_dump(isset($x[0]));
var_dump(isset($x[1]));
echo "with array():\n";
$y=array(0=>NULL,1=>1);
var_dump(array_key_exists(0,$y));
var_dump(array_key_exists(1,$y));
var_dump(isset($y[0]));
var_dump(isset($y[1]));
Expected result:
----------------
with ArrayAcces:
bool(true)
bool(true)
bool(false)
bool(true)
with array():
bool(true)
bool(true)
bool(false)
bool(true)
Actual result:
--------------
with ArrayAcces:
bool(false)
bool(false)
bool(true)
bool(true)
with array():
bool(true)
bool(true)
bool(false)
bool(true)
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=34849&edit=1