Странное поведение при заполнении массива php - PullRequest
0 голосов
/ 28 апреля 2018

Я делаю класс, который реализует Iterator в PHP. Этот класс предоставляет свойство «records», которое определяется как:

private $records = [];

В теле класса создайте метод для заполнения массива:

    /**
    * Add an item to the activeRecord collection
    * @param IActiveRecord $activeRecord
    */
   public function set(IActiveRecord $activeRecord){
    echo "Add" . $activeRecord->id . " to collection<br>\n";
    $this->records[] = $activeRecord;
    echo $this . "<br>\n";
   }

Оператор echo $ this относится к методу __toString (), который очеловечивает содержимое массива:

    /**
 * Humanize class
 * @return string
 */
public function __toString(): string {
    $output = "Number of activeRecords : " . $this->size() . "<br>\n";

    foreach($this as $record) {
        $output .= "id : " . $record->id . "<br>\n";
    }

    return $output;
}

Когда я заполняю коллекцию из результата запроса, я получаю:

Add 1 to collection<br>
Number of activeRecords : 1<br>
id : 1<br>
<br>
Add 2 to collection<br>
Number of activeRecords : 2<br>
id : 2<br>
id : 2<br>
<br>

Как видите, первая итерация заполняется с id = 1, но на второй итерации добавляется id = 2 и также заменяется первый элемент на id = 2 ...

Я понятия не имею об этом странном поведении ... Методы итератора реализованы правильно (я думаю):

    /**
 *
 * {@inheritDoc}
 * @see Iterator::current()
 */
public function current(){
    return $this->records[$this->index];
}

/**
 * {@inheritDoc}
 * @see Iterator::next()
 */
public function next() {
    $this->index++;
}

/**
 * {@inheritDoc}
 * @see Iterator::key()
 */
public function key(){
    return $this->index;
}

/**
 * {@inheritDoc}
 * @see Iterator::valid()
 */
public function valid(){
    return $this->index < count($this->records) ? true : false;
}

/**
 * {@inheritDoc}
 * @see Iterator::rewind()
 */
public function rewind(){
    $this->index = 0;
}

РЕДАКТИРОВАТЬ 1: activeRecord - это объекты, которые поступают из контроллера:

    /**
 *
 * {@inheritDoc}
 * @see \wp\Database\SQL\Select::selectBy()
 */
public function selectBy(){

    $this->statement = $this->entity->selectBy();

    if ($this->statement !== false){
        $this->statement->setFetchMode(\PDO::FETCH_OBJ);
        while($data = $this->statement->fetch()){
            $record = $this->entity->getActiveRecordInstance();
            $record->hydrate($data);
            $this->activeRecords->set($record);
        }
        return true;
    }

    return false;
}

В этом методе $ this-> entity-> getActiveRecordInstance () имеет вид:

    /**
 * Return new ActiveRecord instance
 * @return \App\Entities\Promoteurs\PromoteursActiveRecord
 */
public function getActiveRecordInstance(){
    return new ActiveRecord($this->columns);    
}

Итак, я уверен, что заполненный ActiveRecord является новым объектом на каждой итерации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...