Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   из array php в Vector.<T> AS3 (http://www.flasher.ru/forum/showthread.php?t=165681)

Silicium 25.08.2011 17:53

из array php в Vector.<T> AS3
 
Использую Zend Framework.
PHP код:

/**
* @var something_type
*/
public $something

- такая переменная в AS определяется как SomethingType - класс AS, соответствующий something_type,
а вот с такой:
PHP код:

/**
* @var multitype:something_type
*/
public $array_of_something

возникают проблемы. На входе получаем Array, каждый из элементов которого просто Object. А хотелось бы получить Array of SomethingType, а еще лучше Vector.<SomethingType>

Прошу помочь))

etc 26.08.2011 00:21

Просто так не получится, нужно будет реально создавать SomethingType, десериализовать объекты в них и засовывать в Vector.

Silicium 26.08.2011 11:38

Вот тут столкнулся с такой неприятностью (пишу не из дома, так что скопипастить код не смогу, пишу на память)
Есть класс SomethingData в AS и соответствующий something_data в пхп. Т-к SomethingData помечен тегом [RemoteClass], то при получении данных, и при условии, что в пхп коде к методу, возвращаемому something_data есть коммент
PHP код:

/** 
* @return something_data 
*/ 

полученный объект определится как SomethingData (Механизм мне не известен). Пусть в классе something_data есть поле something_array, состоящий из объектов something_type (о чем речь шла в первом посте).
В AS классе должна быть паблик переменная или сеттер, именуемая something_array (иначе мы ее не получим). Я пытался сделать преобразование типа через сеттер/геттер, но, т-к у них должен быть одинаковый тип, ничего не вышло. Можно конечно сделать метод getSomethingArray, но мне в этом случае не нравится, что останется либо паблик сеттер, либо просто поле, и я могу руками ковырять массив. Меня это смущает сильно.

Silicium 03.09.2011 03:07

В PHPDoc надо писать array[Something_Type]

wvxvw 03.09.2011 14:08

[RemoteClass] делает следующее (при чем очень плохо, с попыткой предотвратить конфликты с флексовыми модулями, и там у него просто не получается это сделать, но это отдельная история, вобщем, не используйте его).
Код AS3:

flash.net.registerClassAlias("alias", theClass);

Если вас интересует, как именно он это делает - можете скомпилировать с ключем -keep и посмотреть исходники FlexInit, это где-то там было если память не изменяет.

Дальше, если вы получаете массив из объектов типа Object, а не любого из его наследников (кастование к нужному типу приводит к ошибке) - это значит, что сериализация вообще не работает. Zend_Amf - не лучшая библиотека, кроме того, не реализует всех возможностей формата, и очень плохо настраивается. На столько плохо, что легче написать по-новой, чем ее настроить. Это касается бесконечной вереницы класс-лоадеров в Zend и мартышкиными потугами "замутить крутую архитектуру", которая вылилась в 100500 никому не нужных классов... Но, опять же, эта информация вам мало поможет :) Так вот, если сериализация вообще не работает, значит Zend не находит PHP классы нужные для нее... Комментарии возвращаемого типа нужны, на сколько я знаю, для генерации кода какими-то инструментами Flash Builder'a, на сериализацию они не влияют / их вообще можно не писать.

Если вы получаете массив из объектов нужного типа: у вас все работает, как нужно, Vector.<T> появился после того, как был написан AMF3.0 формат, и по-этому пока-что не используется в сериализации (не смотря на то, что некоторые реализации понимают тег #13 - это так бы записывался вектор, если бы он был, но, при этом Флеш плеер оказывает медвежью услугу - он, когда сериализует Vector.<T>, то всегда тип указывает как Vector.<Object>, что, вобщем-то, делает всю идею бесполезной.
Поэтому, как говорилось выше - если вам нужен вектор, прийдется его создавать из массива - о целесообразности думайте сами: есть ли смысл расходовать память / так уж ли необходимо быть там вектору?

Silicium 03.09.2011 14:29

Страшно становится)))) Вывод на будущее: Zend - в топку?
Писать все руками, и пользоваться чистым AS3? Или все-же какие-то Flex-вкусности и инструменты Builder-а могут быть полезны?

wvxvw 03.09.2011 20:11

Ну, смотрите... код сгенеренный в FB может быть полезным в некоторых ситуациях:
- что-то потестировать (просто быстрее сгенерить, чем написать).
- для совсем новичков, которые сами не напишут.
Но использовать в настоящем работающем приложении... я бы даже не задумывался о такой возможности :)
Что до Zend - я знаком только с Zend_Amf. Это по сути продолжение AMFPHP, которое один из коммитеров решил приладить к Zend, и его поддержали. На первый взгляд, то, что касалось сериализации / общения с клиентом не поменялось, но добавилась куча мусора связанного с Zend фреймворком, ну и ограничения на имена файлов / классов и т.п. Кроме того, из-за того, что нужно было приткнуть "архитектуру" к уже работающей библиотеке, библиотека стала работать хуже :) В смысле медленнее.
Ну и в целом про Flex говорить бы не стал тоже :) есть и позитивные моменты. Но мое глубокое убеждение, что шаблоны хороши только тогда, когда
- точно знаешь какой код из них создается.
- есть возможность их поменять, если нужно.
Первое достижимо методом проб и ошибок, второе - никак, если мы говорим про Flash Builder... но это, судя по всему идеология разработчиков такая, смысл которой от меня ускользает.

Silicium 04.09.2011 15:23

Ясно. А бенчмаркам не верить? http://www.jamesward.com/census2/


Часовой пояс GMT +4, время: 09:55.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.