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] f...@php.net 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