Невозможно использовать объект типа stdClass в качестве массива

Во-первых, я не фанат Php... так что извините за мои небольшие познания в PHP. Я использую AMPHPHP2 с Flex на интерфейсе. Я могу извлекать данные из бэкэнда в виде типизированных объектов, но когда я пытаюсь сохранить, у меня возникает эта проблема, как показано ниже:

<br /><b>Fatal error</b>:  Cannot use object of type stdClass as array in <b>/mnt/array1/share/htdocs/htdocs/admin/application/amf/services/Item.php</b> on line <b>88</b><br />

Ниже приведен код, выдающий эту ошибку:

Line86    public function saveCollection($collection) {
Line87        for ($i=0; $i<count($collection); $i++) {
Line88            $this->saveItem($collection[$i]);
Line89        }
Line90    }

Ниже приведены мои классы VO: ItemVO.php

class ItemVO {
..
..
var $_explicitType = "ItemVO";
..
..
}

ТоварVO.as

package models.vo {
    [RemoteClass(alias="ItemVO")]  
    public class ItemVO {
...
...
    }
}

Вот моя структура папок:

-root/
------*.html
------*.swf
------application/
-----------------amf/
--------------------/index.php
--------------------/models/vo/all vo files
--------------------/services/all services
-----------------libraries/
--------------------------/Amfphp/

Вот мой index.php

<?php
require_once dirname(dirname(__FILE__)) . '/libraries/Amfphp/ClassLoader.php';
$config = new Amfphp_Core_Config();
$config->serviceFolderPaths = array(dirname(__FILE__) . '/services/');
$voFolders = array(dirname(__FILE__) . '/models/vo/');
$customClassConverterConfig = array(‘customClassFolderPaths’ => $voFolders);
$config->pluginsConfig['AmfphpCustomClassConverter'] = $customClassConverterConfig;
$gateway = Amfphp_Core_HttpRequestGatewayFactory::createGateway($config);
$gateway->service();
$gateway->output();
?>

Любая помощь будет оценена. Спасибо.


person M.D.    schedule 01.03.2012    source источник
comment
вы можете попробовать var_dump($collection) в строке 87. Это может подсказать проблему.   -  person Ajeet Sinha    schedule 01.03.2012
comment
Лучшим решением, чем просто вывод всей переменной, особенно если она очень большая, будет gettype($collection);   -  person OpenSorceress    schedule 01.03.2012
comment
Похоже, на стороне PHP мы не можем обрабатывать ArrayCollections. Я попробовал свой код, отправив массивы с клиентской стороны вместо ArrayCollections, и он работал как есть. Большое спасибо за все материалы.   -  person M.D.    schedule 02.03.2012


Ответы (3)


Сообщение об ошибке говорит само за себя. Вы можете использовать, например. это:

public function saveCollection($collection) {
 foreach ($collection as $value) {
          $this->saveItem($value);
       }
   }
person Dr.Molle    schedule 01.03.2012
comment
Я уже пробовал это. Ошибка по-прежнему остается с $this->saveItem($value); линия - person M.D.; 01.03.2012
comment
Та же ошибка или другая ошибка? Что содержит коллекция $? - person Dr.Molle; 01.03.2012
comment
saveCollection(updateItems) вызывается как _remote.saveCollection(updateItems) из кода Flex на стороне клиента. Где _remote — это RemoteObject на стороне клиента, а updateItems — это ArrayCollection объектов Typed. Спасибо. - person M.D.; 02.03.2012

Мое основное понимание ошибки заключается в том, что вы пытаетесь получить доступ к объекту, как если бы это был массив.

Обычно это означает, что вы делаете $something['something'] вместо правильного $something->something.

Является ли параметр $collection массивом saveCollection или объектом?

Попробуйте заменить строку 88 на:

 $this->saveItem($collection->$i);

Изменить –

Как я только что понял в комментариях, это все равно не должно работать, потому что вы пытаетесь подсчитать stdClass. Использование for each должно помочь, как кто-то упомянул в ответе.

person IOrlandoni    schedule 01.03.2012
comment
Я не думаю, что вы можете вызвать count с объектом... не так ли? - person Travesty3; 01.03.2012
comment
@Travety3 stdClass не реализует интерфейс Countable, так что нет. count всегда должен возвращать 1 в таких случаях. Если его структура довольно проста, вы можете привести его к массиву, например: count((array)$stdObj) - person IOrlandoni; 01.03.2012
comment
Я просто указал, что вы не рассмотрели эту часть кода OP в своем решении. Вы предположили, что единственное, что ему нужно изменить, это код внутри цикла for, но ему также нужно будет изменить конечное условие самого цикла for. Возможно, вы захотите изменить свой ответ. - person Travesty3; 01.03.2012

Вы ссылаетесь на stdClass объект как на массив, это не одно и то же. Для вашей цели вы можете использовать его как массив:

public function saveCollection($collection) {
    $collection = (array)$collection;
    for ($i=0; $i<count($collection); $i++) {
        $this->saveItem($collection[$i]);
    }
}

ПРИМЕЧАНИЕ. Преобразование объекта в массив не всегда работает, но, поскольку похоже, что вы ожидаете передачи структуры, подобной массиву, это, вероятно, будет работать нормально.

person Travesty3    schedule 01.03.2012