【发布时间】:2013-01-04 05:45:10
【问题描述】:
我收到了这条通知:
ArrayIterator::next(): 数组在对象外部被修改,内部位置在 /var/www 中不再有效...
这是由这段代码在foreach循环开始时产生的。连同通知一起,foreach 循环重新开始迭代。换句话说,只要发生这种情况,内部位置就会被重置。但是根据php手册,ArrayObject默认使用ArrayIterator。
手册上说 ArrayIterator 是这样的
此迭代器允许在迭代数组和对象时取消设置和修改值和键。
我在这里遗漏了什么吗?我发现了一些关于 ArratIterator 的错误报告,但不是这种。是bug还是我的错?
版本:PHP 版本 5.3.10-1ubuntu3.4
<?php
//file 1:
// no namespace
abstract class holder extends \ArrayObject{
// abstract function init();
public function __construct($init){
parent::__construct($init, 1);
}
}?>
<?php
//file 2:
namespace troops;
class holder extends \holder{
public function __construct(){
parent::__construct($this->init());
}
private function init(){
return array( /*... some data from db ...*/ );
}
public function saveData(){
foreach($this as $k => $v){
$this->save($v);
if($v->number_of_items==0) {
unset($k);
// $this->offsetUnset($k); // tryed both
}
}
}
}
?>
【问题讨论】:
标签: php spl arrayobject