2010-05-13 4 views
0

Мне нужно создать сайт на PHP 5.1.6, и я только что наткнулся на ошибку на моем сайте, чего не происходит в версии 5.2+. При использовании foreach() для итерации по объекту я получаю следующую ошибку: «Неустранимая ошибка: объекты, используемые в качестве массивов в post/pre increment/decment, должны возвращать значения по ссылке ...»PHP 5.1.6 Ошибка ArrayAccess при итерации по объекту

Кто-нибудь знает, как обойти эту проблему?

  $f_type = new Feeding_type_Model; 
      $f_type->type = $post['feeding_type']; 
      $f_type->quantity = $post['quantity']; 
      $f_type->feeding_id = $feed->id; 
      $f_type->save(); 

       if (strpos($post['feeding_type'], 'comm')) 
       { 
        foreach ($post['commercial_brands'] as $brand) 
        { 
         $comm_food = new Commercial_food_Model; 
         $comm_food->brand = $brand; 
         $comm_food->feeding_type_id = $f_type->id; 
         $comm_food->save(); 
        } 
       } 
+0

В вашем примере, откуда исходит $ f_type? –

+0

$ f_type - это экземпляр объекта (добавленный код выше) - все это отлично работает на php 5.2, поэтому я думаю, что мне нужно найти другой способ итерации ... я задаюсь вопросом, будет ли простой цикл – kenny99

ответ

0

Нашел в комментариях PHP документации, это, кажется, ошибка:

Note that at least in PHP 5.1, objects implementing ArrayAccess cannot return objects by reference. See http://bugs.php.net/bug.php?id=34783 .

Если у вас есть код как

<?php 
$x = &$y[0]; 
?> 

, то это будет (насколько я могу tell) always fail, если $ y не является реальным массивом - он не может работать, если $ y является объектом, реализующим ArrayAccess. Если функция offsetGet() возвращается по ссылке, вы получаете фатальную ошибку «Декларация MyClass :: offsetGet() должна быть совместима с функцией ArrayAccess :: offsetGet()». Однако если вы попытаетесь вернуть его по значению, вы получите (противоречивую) фатальную ошибку «Объекты, используемые в качестве массивов в post/pre increment/decment, должны возвращать значения по ссылке», по крайней мере, в моей версии PHP.

Поэтому невозможно получить произвольный код, связанный с массивами, и попытаться заменить собственный объект на массив, даже если все нормальные функции массива не сработали (что они делают или по крайней мере, некоторые из них).