PHP 5.1.6迭代对象时出现ArrayAccess错误

时间:2010-05-13 09:01:32

标签: php spl arrayaccess

我不得不在PHP 5.1.6上开发一个网站,我刚刚在我的网站上发现了一个在5.2+上没有发生的错误。当使用foreach()迭代一个对象时,我得到以下错误:“致命错误:在post / pre递增/递减中用作数组的对象必须通过引用返回值...”

有谁知道如何解决这个问题?

            $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 :(得分:0)

在php文档评论中发现这个,似乎是一个bug:

  

请注意,至少在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 / decrement中用作数组的对象必须通过引用返回值”,至少在我的PHP版本中。

因此,不可能采用任意代码处理数组并尝试用自己的对象替换数组,即使所有正常的数组函数也没有失败(他们这样做,或者至少其中一些)。