PHP 5.1.6 Ошибка ArrayAccess при переборе объекта - PullRequest
0 голосов
/ 13 мая 2010

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

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

            $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();
                    }
                }

1 Ответ

0 голосов
/ 01 июня 2011

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

Обратите внимание, что по крайней мере в PHP 5.1 объекты, реализующие ArrayAccess, не могут возвращать объекты по ссылке. См. http://bugs.php.net/bug.php?id=34783.

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

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

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

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

...