Edit report at https://bugs.php.net/bug.php?id=33891&edit=1
ID: 33891
Comment by: arvenil at klecza dot pl
Reported by: marcos dot neves at gmail dot com
Summary: make array implements traversable, ArrayAccess and
Countable
Status: Not a bug
Type: Feature/Change Request
Package: *General Issues
Operating System: any
PHP Version: 5.2.13 5.3.2
Block user comment: N
Private report: N
New Comment:
In other words using Traversable interface in php is useless.
There is no way to check if given variable is traversable. You need to drop
type hinting and check if ($a instanceof Traversable || is_array($a)).
I understand that internally array isn't an object - but this is not excuse to
make programmer life harder. If You test if something is Traversable by foreach
then you don't care what this is.
Well at least foreach doesn't care if it get array or object - so this is
possible! But if you still refuse to fix this bug then please make foreach work
only for arrays and create another foreach for object e.g. foreachobject - at
least language will be consistent.
Previous Comments:
------------------------------------------------------------------------
[2010-03-13 18:33:09] marcos dot neves at gmail dot com
Still not working:
<?
function loop(Traversable $traversable)
{
foreach($traversable as $k => $v)
echo "$k => $v\n";
}
$primos = explode(" ", "1 2 3 5 7 11 13 17 19");
// loop($primos); // does not work
loop(new ArrayIterator($primos)); // works
?>
------------------------------------------------------------------------
[2010-03-13 18:17:57] [email protected]
Please try 5.3.2 or 5.2.13.
------------------------------------------------------------------------
[2010-03-13 18:08:24] wrzasq at gmail dot com
It should also expose interfaces ArrayAccess and Countable. It's very
frustrating when you use type hinting to force iterable structures or
array-like accessible and it comes out that you can't pass array themselves.
------------------------------------------------------------------------
[2005-07-27 22:14:08] marcos dot neves at gmail dot com
Description:
------------
Traversable is an internal interface that says "I can be used in a foreach".
Since array can be used too, would be nice if array be accepted internally in
parameters that expect traversable.
Reproduce code:
---------------
<?
function acceptArray(array $t) {
echo "\n".__FUNCTION__."\n";
foreach($t as $k=>$v) {
echo "$k=>$v\n";
}
}
function acceptTraversable(Traversable $t) {
echo "\n".__FUNCTION__."\n";
foreach($t as $k=>$v) {
echo "$k=>$v\n";
}
}
$test = array("is", "array", "traversable", "too", "?");
acceptArray($test); // ok
acceptTraversable(new ArrayIterator($test)); // ok
acceptTraversable($test); // would be nice
?>
Expected result:
----------------
acceptTraversable($test); shoud accept an array, since it's too a Traversable
structure(can be used in a foreach).
Actual result:
--------------
Fatal error: Argument 1 must be an object of class Traversable
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=33891&edit=1