0

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

1 に答える 1

0

これはphpドキュメントのコメントで見つかりました。バグのようです。

少なくともPHP5.1では、ArrayAccessを実装するオブジェクトは参照によってオブジェクトを返すことができないことに注意してください。http://bugs.php.net/bug.php?id=34783を参照してください。

あなたがのようなコードを持っているなら

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

そうすると、これは(私が知る限り)$ yが実際の配列でない限り、常に失敗します。$ yがArrayAccessを実装するオブジェクトである場合、これは機能しません。offsetGet()関数が参照によって返される場合、致命的なエラー「MyClass :: offsetGet()の宣言はArrayAccess :: offsetGet()の宣言と互換性がなければなりません」が発生します。ただし、値で返すようにしようとすると、少なくとも私のバージョンのPHPでは、「post / preインクリメント/デクリメントで配列として使用されるオブジェクトは参照によって値を返す必要があります」という(矛盾する)致命的なエラーが発生します。

したがって、通常の配列関数のすべてが失敗しなかったとしても(または少なくとも一部は失敗しなかったとしても)、配列を処理する任意のコードを取得して、独自のオブジェクトを配列に置き換えようとすることはできません。 )。

于 2011-05-31T20:42:16.127 に答える