2012-03-01 29 views
0

Прежде всего, я не Php geek .. так извините мои небольшие знания в области PHP. Я использую AMFPHP2 с интерфейсом Flex на интерфейсе. я могу вытащить данные из внутреннего интерфейса, как типизированных объектов в порядке, но когда я пытаюсь сохранить, я имею эту проблему, как показано ниже:Нельзя использовать объект типа stdClass как массив

<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"; 
.. 
.. 
} 

ItemVO.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(); 
?> 

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

+0

вы можете попробовать var_dump ($ collection) в строке 87.it может дать намек на проблему. –

+0

Лучшее решение, чем просто сброс всей переменной, особенно если она очень большая, будет gettype ($ collection); – OpenSorceress

+0

Похоже, на стороне PHP мы не можем обрабатывать ArrayCollections.Я попробовал свой код, отправив Arrays из clientide вместо ArrayCollections, и он работал так, как есть. Большое спасибо за все материалы. –

ответ

3

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

public function saveCollection($collection) { 
foreach ($collection as $value) { 
      $this->saveItem($value); 
     } 
    } 
+0

Я уже пробовал это. Ошибка все еще сохраняется с «$ this-> saveItem ($ value);» line –

+0

Те же ошибки или другая ошибка? Что содержит набор $? –

+0

saveCollection (updateItems) вызывается как _remote.saveCollection (updateItems) из кода Flex на стороне клиента. Где _remote - это RemoteObject на стороне клиента, а updateItems - это массив ArrayCollection из типизированных объектов. Благодарю. –

3

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

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

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

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

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

Edit -

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

+0

Не думаю, что вы можете вызвать 'count' с объектом ... не так ли? – Travesty3

+0

@ Travesty3 'stdClass' не реализует интерфейс' Countable', поэтому нет. 'count' должен всегда возвращать 1 в этих случаях. Если структура довольно проста, вы можете передать ее в массив, например: 'count ((array) $ stdObj)' –

+0

Я просто указывал, что вы не обращались к этой части кода OP в своем решении. Вы предположили, что ему нужно изменить только код _inside_ for-loop, но ему также нужно будет изменить конечное условие самого цикла for. Можете изменить свой ответ. – Travesty3

0

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

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

Примечание: Кастинг объект как массив не всегда работает, но так как это выглядит, как вы ожидаете массив типа структуры в будет передан, он, вероятно, будет работать нормально.

Смежные вопросы