Req #49369 [Com]: Change current(), key(), next(), etc. to check for Iterator
| From: | levim@php.net | Date: | Fri, 16 Nov 2012 04:33:26 +0000 |
| Subject: | Req #49369 [Com]: Change current(), key(), next(), etc. to check for Iterator | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-174743@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=49369&edit=1
ID: 49369
Comment by: levim@php.net
Reported by: admin at ifyouwantblood dot de
Summary: Change current(), key(), next(), etc. to check for
Iterator
Status: Open
Type: Feature/Change Request
Package: Arrays related
Operating System: *
PHP Version: *
Block user comment: N
Private report: N
New Comment:
Also, calling
current($i) gets the current value of the object $i which is
the
array; it doesn't call $i->current.
Previous Comments:
------------------------------------------------------------------------
[2012-11-16 04:27:19] levim@php.net
I'm not sure this is a php bug. Iterators should be rewound almost 100% of the
time before being used, especially when using an array or an object that
implements Iterator instead of IteratorAggregate.
Maybe the documentation should try to make this better known?
------------------------------------------------------------------------
[2012-07-01 11:14:30] bugs dot php dot net dot nsp at cvogt dot org
As a further note, the current behavior or current() also leaks private fields unlike e.g. http://php.net/manual/en/language.oop5.iterations.php.
class Test{
private $field = 5;
public $field3 = 6;
}
$t = new Test;
print current($t);
Expected result:
6
Actual result:
5
------------------------------------------------------------------------
[2009-08-26 10:34:05] admin at ifyouwantblood dot de
Description:
------------
it would be helpful for chained Iterators, if the default array functions would check if an given
object is an instanceof Iterator and react appropriate.
thus key() calling object->key(), current() calling object->current() and so on.
Reproduce code:
---------------
<?php
class iterator_array implements Iterator
{
protected $aarray;
public function __construct($array)
{
$this->aarray=$array;
}
public function key()
{
return key($this->aarray);
}
public function current()
{
return current($this->aarray);
}
public function valid()
{
return (current($this->aarray)!==FALSE);
}
public function next()
{
next($this->aarray);
}
public function rewind()
{
reset($this->aarray);
}
}
$i=new iterator_array(Array(1,2));
var_dump(current($i));
var_dump(key($i));
next($i);
var_dump($current($i));
var_dump(key($i));
Expected result:
----------------
int(1)
int(0)
int(2)
int(1)
Actual result:
--------------
array(6) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
[3]=>
int(4)
[4]=>
int(5)
[5]=>
int(6)
}
string(9) "�*�aarray"
bool(false)
NULL
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=49369&edit=1