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

Reply via email to