【问题标题】:PHP 5.1.6 ArrayAccess error when iterating over object迭代对象时出现 PHP 5.1.6 ArrayAccess 错误
【发布时间】:2011-02-19 00:12:56
【问题描述】:

我必须在 PHP 5.1.6 上开发一个站点,我刚刚在我的站点中遇到了一个错误,而该错误在 5.2+ 上没有发生。使用 foreach() 遍历对象时,出现以下错误:“致命错误:在后/前递增/递减中用作数组的对象必须通过引用返回值...”

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

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

【问题讨论】:

  • 在你的例子中,$f_type 来自哪里?
  • $f_type 是一个实例化对象(上面添加的代码) - 这一切都适用于 php 5.2,所以我想我需要找到一种不同的迭代方式......我想知道是否有一个简单的 for 循环会做

标签: php spl arrayaccess


【解决方案1】:

在php文档cmets中找到了这个,好像是个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() 的声明兼容”。然而,如果你试图让它按值返回,你会得到(矛盾的)致命错误“在后/前递增/递减中用作数组的对象必须通过引用返回值”,至少在我的 PHP 版本中是这样。

因此,不可能使用任意代码处理数组并尝试用您自己的对象替换数组,即使所有普通数组函数都没有失败(它们确实失败了,或者至少失败了)其中一些)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2011-02-24
    • 2018-04-24
    • 2021-06-14
    • 2014-03-16
    • 2021-01-23
    • 1970-01-01
    相关资源
    最近更新 更多