Req #33891 [Com]: make array implements traversable, ArrayAccess and Countable
| From: | arvenil at klecza dot pl | Date: | Sun, 07 Oct 2012 19:41:38 +0000 |
| Subject: | Req #33891 [Com]: make array implements traversable, ArrayAccess and Countable | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-173925@lists.php.net to get a copy of this message | ||
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] fa@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