私はこの通知を受け取りました:
ArrayIterator :: next():配列がオブジェクトの外部で変更され、内部位置が/ var /www..で無効になりました。
これは、foreachループの開始時にこのコードによって生成されます。通知とともに、foreachループが繰り返し開始されます。つまり、このようなことが起こると、内部位置がリセットされます。しかし、phpマニュアルによると、ArrayObjectはデフォルトでArrayIteratorを使用しています。
そしてマニュアルはArrayIteratorについてこれを言います
このイテレータを使用すると、配列とオブジェクトを反復処理しながら、値とキーの設定を解除して変更できます。
ここで何かが足りませんか?ArratIteratorに関するバグレポートをいくつか見つけましたが、この種のものは見つかりませんでした。それはバグですか、それとも私の悪いですか?
バージョン: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
}
}
}
}
?>