Flex для PHP-распрацоўнікаў
Я працаваў з вэб-тэхналогіямі, пачынальна з ранніх 90-х, і маёй першай сервернай тэхналогіяй была мова PHP. Потым я працаваў з ColdFusion і Java, але заўсёды лічыў сябе PHP-распрацоўнікам. Калі прыйшоў AJAX, я пачаў працаваць з фрэймворкамі тыпу Prototype і script.aculo.us, і пачаў ствараць уласныя фрэймворкі.
У канцы 2006 гады я ўпершыню паспрабаваў распрацоўку на Flex. Гэта было штосьці накшталт экспрэс-курсу, бо ў мяне было ад 4 да 6 тыдняў на стварэнне дэма-прыкладанні для выходзільнай неўзабаве версіі FDS (Flex Data Services, зараз завуцца LiveCycle Data Services). Хоць я быў пачаткоўцам ва Flex і FDS, праект пайшоў добра, і я сапраўды нацешыўся распрацоўкай і працэсам вывучэння.
Тым не менш, як бы прыемна гэта ні было, гэта было нешта іншае. Я маю на ўвазе, што, калі я рабіў вэб-прыкладанні на ColdFusion ці Java, я не адчуваў вялікай розніцы ў параўнанні з PHP; гэта было больш пытаннем пошуку правільных API і засваенні спецыфікі мовы. Пазней, калі я пачаў працаваць з AJAX для DHTML, гэта таксама не так моцна адрознівалася. Вялікая частка сайта стваралася з дапамогай усе тых жа тэхнік сервернай мовы, трэба было проста дадаць спецый тут і там (у дадзеным выпадку – некаторых AJAX- віджетаў).
Калі я зрабіў свой першы праект на Flex, о, мой хлопчык, гэта было такое пераключэнне! Выразны падзел паміж кліентам і серверам (бізнэс-логіка на боку кліента ў дадатак да бізнэс-логіцы на боку сервера), кліенцкая тэхналогія, якая кампілявалася, а не інтэрпрэтавалася, два мовы на кліенце, і ўсё гэта патрабавала іншай налады розуму, чым традыцыйная вэб-распрацоўка.
Гэта і ёсць мой чыннік для напісання гэтага артыкула. Я жадаю падзяліцца з вамі некаторымі з асаблівасцяў Flex адносна PHP. Разам з гэтым, я жадаю прадставіць Flex, параўноўваючы яго з PHP там, дзе такое параўнанне мае сэнс. Такім чынам, гэты артыкул прызначана для:
- PHP-распрацоўнікаў, якія жадаюць пазнаць о Flex і ActionScript 3 больш, чым можа даць простае вызначэнне;
- PHP-распрацоўнікаў, якія ўжо зрабілі свае першыя спробы кадавання Flex-прыкладанняў і жадаюць шырэйшага і глыбокага разумення
Чаго няма ў гэтым артыкуле? Мой намер не ў тым, каб ператварыць вас у флексеров, і не ў тым, каб пераканаць вас у перавазе Flex над X ці Y. Я цвёрда веру, што існуюць розныя тыпы праектаў, і што яны могуць і павінны быць рэалізаваны з дапамогай розных прылад. Калі прадукцыйнасць, максімальная аддача ад інвестыцый і выгода з’яўляюцца галоўнымі прыярытэтамі, то няма такой рэчы, як універсальная прылада.
У той жа час, гэты артыкул не з’яўляецца поўнай дакументацыяй да Flex ці ActionScript3. Існуюць дзясяткі кніг, якія ахопліваюць гэту тэму сотнямі старонак. Ёсць тысячы артыкулаў о Flex. Мая мэта – даць вам досыць інфармацыі па найболей важных тэмах і там, дзе гэта мае сэнс, звязаць канцэпцыі Flex з аналагічнымі паняццямі з PHP. Каб артыкул быў карыснай, я структураваў яе і паспрабаваў не ўдавацца занадта глыбока ў дэталі. У канцы я даю кароткія ўводзіны ў Adobe AIR і спасылкі на дадатковыя рэсурсы, калі вам патрэбна падрабязная інфармацыя па гэтых пытаннях.
Для большасці прыкладаў я абраў Flex 3, на гэта значыць пары чыннікаў. Па-першае, падчас напісання гэтага артыкула Flex 4 усё яшчэ не выйшаў. Па-другое, Flex 4 галоўным чынам з’яўляецца эвалюцыяй Flex 3, так што вялікая частка апісваных рэчаў можа быць ужыта да Flex 4 з мінімальнымі зменамі, калі яны наогул спатрэбяцца. У некаторых выпадках я пакажу на гэтыя адрозненні. Што да PHP, то я выкарыстоўваю версію PHP 5.3. Зараз паглядзім утрыманне, а затым – пагрузімся ў матэрыял!
- Што такое Flex?
- Уводзіны ў мову MXML
- Уводзіны ў мову ActionScript 3
- Flex асінхронны
- Злучэнне дадзеных, метададзеныя і адлюстраванне
- Дзе мае дадзеныя, давайце іх сюды!
- Аўтэнтыфікацыя карыстача ва Flex- і PHP-праектах
- Праца над праектамі Flex і PHP
- Што такое Adobe AIR?
- Што будзе з Flash далей??
- Куды накіравацца пасля ўсяго гэтага
Што такое Flex?
Найпросты адказ: Flex – гэта проста яшчэ адзін спосаб стварэння Flash-прыкладанняў. Flex-прыкладанне кампілюецца ў SWF-файл, які прайграваецца ў браўзары з дапамогай Flash Player. Але навошта патрэбен яшчэ адзін спосаб стварэння Flash-прыкладанняў? Традыцыйна Flash-прыкладанні ствараліся ў асяроддзі распрацоўкі Flash. Калі вы пагледзіце на яе, тыя вы заўважыце, што яна арыентавана галоўным чынам на дызайнераў. Там ёсць сцэна, часавая шкала, прылады малявання і г.д.
Пры распрацоўцы прыкладанняў важную ролю гуляе прадукцыйнасць, вам патрэбныя кампаненты, вы жадаеце максімальна спрасціць распрацоўку, выкарыстоўваць код паўторна, і, не ў апошнюю чаргу, вы жадаеце сучасную IDE – інтэграванае асяроддзе распрацоўкі.
Так што перагледжаны адказ можа быць такім: Flex – гэта фреймворк з адкрытым зыходным кодам, які дапамагае распрацоўнікам хутка ствараць насычаныя інтэрнэт-прыкладанні (RIA, Rich Internet Applications), працавальныя ўсярэдзіне Flash Player. Фреймворк да сённяшняга дня добра вывастраны ў параўнанні са сваім першапачатковым станам у 2006 году, калі выйшаў Flex 2, Flash Player 9 і ActionScript 3.[top]
Flex: два мовы і адзін фреймворк, каб іх звязаць
Пад дахам Flex насамрэч можна знайсці вось што:
- Два мовы: MXML і ActionScript 3. Flex прапануе два мовы для распрацоўкі прыкладання. У наступных частках я паглыблюся ў кожны з іх.
- Багатая бібліятэка кампанентаў.
- Кампілятары і адладчык.
- Прылады каманднага радка для кампілявання і адладкі прыкладання Flex.
Бо Flex з’яўляецца фреймворком з адкрытым зыходным кодам, то я заклікаю вас сыходзіць на хатнюю старонку гэтага праектаhttp://opensource.adobe.com/flex і запампаваць SDK. Вы можаце ўбачыць зыходны код усіх кампанентаў бібліятэкі, можа праверыць адкрытую базу дадзеных багаў і фіч (http://bugs.adobe.com/flex), і вы можаце ўбачыць старонкі вікі са спецыфікацыямі.
Часткова высокая прадуктыўнасць Flex забяспечваецца вялікай бібліятэкай кампанентаў. Там ёсць усе мажлівыя UI-кампаненты (палі ўводу, панэлі, вокны, слайдары, датагрыды, комбабоксы, акардэоны, табулятары…) Ёсць кантэйнеры для разметкі і элементы формаў. Ніжэй вы ўбачыце скрыншот з даступнымі кампанентамі Flex 3 (клікніце, каб павялічыць).
І калі гэтых кампанентаў вам недастаткова, тыя вы можаце стварыць свае ці пашырыць існыя, бо ў вас ёсць доступ да зыходных кодаў.
[top]
Чаму варта ведаць пра Flex
Перш, чым паглыбіцца ў вывучэнне, давайце зробім паўзу і вернемся да чыннікаў, па якіх вас можа быць цікавы Flex.
Традыцыйныя HTML вэб-прыкладанні маюць архітэктуру “запыт-адказ”. Браўзар адпраўляе запыт, а сервер пасылае ў адказ старонку, і гэты цыкл паўтараецца. HTML і CSS – выдатны выбар для ўяўлення інфармацыі, магчыма, адзін з лепшых. Але з гадамі гэта архітэктура выйшла за рамкі простага статычнага ўяўлення інфармацыі і стала платформай для прыкладанняў. З дапамогай скрыптовых тэхналогій нам атрымалася стварыць дынамічныя старонкі і мець зносіны з серверам з дапамогай вузейшых і пэўных запытаў. Акрамя таго, дадаўшы, DHTML і AJAX, мы ўдыхнулі новае жыццё ў абслугоўваныя серверам старонкі: карыстач можа працаваць з загружанай старонкай і змяняць яе выгляд без неабходнасці абнаўлення ўсёй старонкі.
З развіццём тэхналогій з’явіліся больш складаныя прыкладанні. Некаторыя вэб-прыкладанні пачалі паўтараць поўнафункцыянальныя прыкладанні для настольных ПК, і ў той жа час захавалі выгоду вэба: яны даступныя адусюль, дзе ёсць браўзар і падлучэнне да Інтэрнэту. Так з’явіліся анлайнавыя версіі электронных табліц і тэкставых рэдактараў.
Аднак, з пункту гледжання юзабіліці, Інтэрнэт-прыкладанні былі не так прыязныя да карыстача, як настольныя. У той жа час, для стварэння гэтых складаных вэб-прыкладанняў трэба валодаць шматлікімі тэхналогіямі (JavaScript, DHTML, CSS, AJAX-бібліятэкі, серверныя тэхналогіі) і мець досвед абыходу адрозненняў паміж браўзарамі і тым, як яны рендерят HTML/CSS/JS.
Так у 2002 году Macromedia увяла тэрмін RIA (Rich Internet Applications) для апісання новага пакалення прыкладанняў, якія спалучаюць перавагі настольных і вэб-прыкладанняў. Тэхналогія Flash Player зрабіла гэта магчымым.
Увогуле, калі вы жадаеце стварыць прыкладанне (не толькі сайт ці вэб-старонку), то можна зрабіць гэта з дапамогай Flex. Некаторыя рэчы проста немагчымыя ў HTML/JavaScript, іншыя вельмі складана рэалізаваць аднолькава для ўсіх браўзараў. Flash Player прапануе адну з лепшых графічных сістэм, ён усталяваны на 98% падлучаных да Інтэрнэту кампутараў і добра працуе з гукам і малюнкамі. Ён падтрымлівае мікрафоны і вэб-камеры, струменевае прайграванне і абмен дадзенымі, выдатна працуе з тыпаграфікай, і гэты спіс можна працягнуць.
Зірніце на тры прыкладанні, якія даюць уяўленне пра магчымасці Flex:
- SumoPaint бясплатны графічны рэдактар
- Mindomo прыкладанне для складання ментальных карт (MindMaps)
- Times Reader чыталка для The New York Times
У той жа час іншыя тэхналогіі ўвайшлі ў сферу RIA. Акрамя AJAX-паляпшэнняў, якія зрабілі магчымымі такія прыкладанні як Gmail ці Google Spreadsheets, сёння мы маем таксама Silverlight ад Microsoft і JavaFX ад Sun.
[top]
Ад тонкага кліента – да разумнага і багатага кліента
Давайце вернемся да браўзараў і таму, як пастаўляюцца вэб-прыкладанні. Калі браўзар адпраўляе запыт, сервер выкарыстоўвае для падрыхтоўкі старонкі камбінацыю статычнага кантэнту (HTML/CSS/JS кода) і скрыптоў, якія могуць зрабіць запыт да базы дадзеных ці выклікаць іншыя скрыпты, а ў выніку даюць HTML/CSS/JS. Гэта старонка загружаецца і адмалёўваецца браўзарам. Ключавы момант у тым, што звычайна гэта старонка (ці адказ) утрымоўвае візуальную разметку разам з прадстаўлянымі дадзенымі.
Калі трэба паказаць новы стан прыкладання, браўзар робіць новы запыт, і сервер падрыхтоўвае новую старонку. Кліент ізноў проста паказвае вынік, атрыманы з сервера.
Flex-прыкладанні працуюць па іншым. Сервер адпраўляе гатовае Flex-прыкладанне (файл SWF), працавальнае ўсярэдзіне браўзара ва ўбудове Flash Player. Як правіла, гэты SWF-файл утрымоўвае толькі бізнэс-логіку на боку кліента. Калі патрэбныя дадзеныя (з базы дадзеных, напрыклад), Flex-прыкладанне запытвае іх. Сервер вяртае дадзеныя (у фармаце XML, JSON ці AMF3), а кліент сам ведае, як прадставіць іх візуальна. У гэтым выпадку мы маем сэрвіс-арыентаваную архітэктуру: Flex-прыкладанне з’яўляецца кліентам, які можа выкарыстоўваць сэрвісы пастаўкі дадзеных. Прыкладанне можа змяніць свой стан без перазагрузкі старонкі ці перазагрузкі SWF-файла ў браўзары. Прыкладанне з’яўляецца кліентам, які можа больш, чым проста паказаць вынік з сервера. Такім чынам, выкарыстоўваючы Flex і Flash Player, можна стварыць амаль любое прыкладанне для Інтэрнэту, ад гульняў і віджэтаў да вялікіх вэб-прыкладанняў для рэдагавання любога выгляду кантэнту і шматлікае іншае.
Але даволі сухой тэорыі, давайце паглядзім код!
[top]
Уводзіны ў мову MXML
MXML – гэта дэкларатыўная мова, заснаваны на XML. У прыкладанні Flex мова MXML выкарыстоўваецца для хуткай разметкі структуры і вонкавага выгляду. Ва Flex усё, што можна зрабіць з MXML, можна таксама зрабіць і з ActionScript 3, але зваротнае не дакладна.
Але калі ў ActionScript 3 можна зрабіць усё тое ж, што і ў MXML, то навошта тады патрэбен MXML? Таму, што звычайна нашмат прасцей чытаць код інтэрфейсу карыстача, апісаны з дапамогай XML-мовы, чым апісаны з дапамогай мовы імператыўнага, такога, як AS3. Так для апісання інтэрфейсу выкарыстоўваецца менш кода. Акрамя таго, нашмат прасцей ствараць прылады для дэкларатыўных моў, чым для імператыўных. Вось прыкладанне “Hello World!” на MXML:
1: <Label text="Hello World!" fontSize="14" color="red" x="100" y="50"/>
У гэтым кодзе я выкарыстоўваю Flex-кампанент Label (Пазнака) для паказу тэксту на экране. Я задаю атрыбуту text той тэкст, які трэба паказаць. Акрамя таго, я жадаў злёгку наладзіць вонкавы выгляд і становішча гэтай пазнакі на экране. Для гэтага я выкарыстоўваю атрыбуты fontSize, color, x і y. Напэўна, вы пагодзіцеся, што гэта даволі просты для разумення код.
Зараз разгледзім той жа прыклад, рэалізаваны з выкарыстаннем ActionScript 3:
1: var myLabel = new Label();
2: myLabel.text = "Hello World!";
3: myLabel.setStyle("fontSize", "14");
4: myLabel.setStyle("color", "red");
5: myLabel.x = 100;
6: myLabel.y = 50;
7: addChild(myLabel);
Тут у мяне сем радкоў кода, каб рабіць тое ж самае, што я зрабіў адным тэгам з атрыбутамі ў MXML! Зараз прадстаўце, што ў рэальных прыкладаннях ёсць шмат элементаў кіравання, якія згрупаваны ў розных кантэйнерах. Значна лягчэй падтрымліваць код, напісаны з выкарыстаннем MXML, чым код у выглядзе сотняў радкоў на ActionScript 3.
Хоць вы можаце выкарыстоўваць MXML для апісання прыкладання, вы не можаце выкарыстоўваць яго ж для рэалізацыі бізнэс-логікі. Для гэтага выкарыстоўваецца ActionScript 3.
Flex-прыкладанні запускаюцца ва Flash Player, а ён разумее толькі ActionScript 2 і ActionScript 3. Гэта азначае, што любы MXML-код вашага прыкладання павінен быць ператвораны кампілятарам MXML у код ActionScript 3. А ўжо гэты код потым пераўтворыцца кампілятарам ActionScript у байт-код (файлы SWF), якія могуць быць зразуметы Flash Player.
Такім чынам, за амаль кожным кампанентам MXML варта ActionScript-клас (але некаторыя MXML-тэгі не маюць адпаведных ім класаў ActionScript, гэта такія тэгі, як Script і Model). Напрыклад, вось урывак з класа Label:
1: public class Label extends UIComponent
2: implements IDataRenderer, IDropInListItemRenderer,
3: IListItemRenderer, IFontContextComponent
4:
5: {
6: /**
7: * Constructor.
8: */
9: public function Label()
10: {
11: super();
12:
13: // this is so the UITextField we contain can be read by a screen-reader
14: tabChildren = true;
15: }
16:
17: /**
18: * @private
19: * Flag that will block default data/listData behavior.
20: */
21: private var textSet:Boolean;
22:
23: ...
24: }
У любым Flex-прыкладанні ёсць прынамсі адзін MXML-файл, які з’яўляецца асноўным прыкладаннем. Напрыклад, вось поўны код прыкладання “Hello World!”:
1: <?xml version="1.0" encoding="utf-8"?>
2: <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
3: <mx:Label text="Hello World!" fontSize="14" color="red" x="100" y="50"/>
4: </mx:Application>
Каранёвы вузел прыкладання – заўсёды Application, і тутака ж вызначаюцца прасторы імёнаў. У дадзеным выпадку ў мяне толькі адна прастора імёнаў для мовы і Flex MXML-кампанент: mx. Гэта код для Flex 3, а ва Flex 4 ёсць невялікія адрозненні – у гэтым месцы аб’яўляецца больш прастор імёнаў.
Калі вы пішаце свае ўласныя кампаненты, то вам прыйдзецца дадаць прасторы імёнаў і для іх. Вось, да прыкладу, я аб’яўляю другую прастору імёнаў для пазначэння ўсіх створаных мной кампанентаў (у гэтым прыкладзе я выкарыстоўваю ўласны кампанент пазнакі пад назвай MyCustomLabel):
1: <?xml version="1.0" encoding="utf-8"?>
2: <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:local="*">
3: <mx:Label text="Hello"/>
4: <local:MyCustomLabel text="world!"/>
5: </mx:Application>
Зараз вам можа стаць цікава, як ва Flex-прыкладаннях звяртацца з некалькімі рознымі старонкамі. Для HTML-сайта розныя станы, як правіла, рэалізуюцца ў розных старонках. Прыкладанне Flex вельмі падобна на прыкладанні для працоўнага стала. Гэта азначае, што вы можаце выкарыстоўваць адзін MXML- файл для адлюстравання ў адной старонцы розных станаў прыкладання. Flex прапануе некалькі спосабаў зрабіць гэта з дапамогай кампанентаў, такіх, як акардэон, навігатар па ўкладках (Tabsets), разметка тыпу “Картка”, а таксама з дапамогай флекс-модуляў.
Вы бачылі, што ў MXML-кодзе можна вызначаць вонкавы выгляд прыкладання. Але вы таксама можаце выкарыстоўваць яго для стварэння сваіх кампанентаў шляхам пашырэння ўжо існых. Паглядзім на прыкладзе. Выкажам здагадку, што ў вашым прыкладанні ёсць мноства формаў, якія маюць дзве кнопкі: Захаваць і Адмяніць. Зірніце на код гэтага MXML-кампанента (код знаходзіцца ўсярэдзіне файла з імем FormButtons.mxml; усё MXML-файлы павінны мець пашырэнне mxml):
1: <?xml version="1.0" encoding="utf-8"?>
2: <mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="150">
3: <mx:Button id="saveButton" label="Save"/>
4: <mx:Button id="cancelButton" label="Cancel"/>
5: </mx:HBox>
Пры стварэнні ўласных кампанентаў можна абраць які пашыраецца кампанент (у MXML нельга пашыраць Application). Я вырашыў пашырыць HBox (гарызантальная скрыня) – гэта кантэйнер, які адлюстроўвае ўсіх сваіх нашчадкаў у адзін радок. Унутр кантэйнера я дадаў дзве кнопкі, адна для захавання і яшчэ адна – для адмены. Таксама я задаў кожнай кнопцы атрыбут id. Выкарыстоўвайце значэнне id у якасці спасылкі на аб’ект з іншых частак кода. Гэта тое ж самае, што і аб’ява зменных у кодзе ActionScript.
Паглядзім, як мага выкарыстоўваць гэты кампанент у прыкладанні:
1: <?xml version="1.0" encoding="utf-8"?>
2: <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:local="*" layout="horizontal">
3: <mx:TextInput width="150"/>
4: <local:FormButtons/>
5: </mx:Application>
Ніжэй паказана, як выглядае прыкладанне:
Вы можаце падумаць, што ў MXML можна выкарыстоўваць толькі візуальныя кампаненты Flex (гэта значыць кампаненты, якія адлюстроўваюцца на экране). Насамрэч гэта не так. Ёсць таксама MXML-тэгі для ўяўлення і захоўванні дадзеных і кампаненты для апрацоўкі дадзеных, яны могуць атрымліваць і адпраўляць дадзеныя з/на сервер. Ніжэй паказаны прыклад агульнага кампанента Object з уласцівасцю name:
1: <mx:Object id="myObj" name="Mihai Corlan"/>
Як я сказаў раней, усё (ці амаль усё) кампаненты Flex маюць адпаведны клас ActionScript, які рэалізуе адлюстраванне (калі такое маецца) і логіку. Калі вы выбіраеце ActionScript замест MXML для стварэння свайго кампанента (няхай гэта будзе візуальны кампанент ці няма), тыя вы павінны мець на ўвазе, што існуе абмежаванне: канструктар класа павінен мець магчымасць выкліку яго без аргументаў (а калі ёсць аргументы, яны павінны мець значэнні па змаўчанні).
[top]
Змешваючы MXML і ActionScript 3
Вяртаючыся да свайго кампанента FormButtons (той самы, з дзвюма кнопкамі), можна заўважыць праблему: а што рабіць, калі трэба выкарыстоўваць гэты кампанент у такім месцы, дзе кнопкі “Захаваць” і “Адмена” не маюць сэнсу? Ці трэба ствараць яшчэ адзін адмысловы кампанент з іншымі патрэбнымі надпісамі (скажам, “Паказаць” і “Схаваць”)? Вядома, гэта варыянт, але ён дрэнна маштабуецца і гэта не элегантна! Што сапраўды жадалася б, так гэта кампанент больш агульнага плану і спосаб яго налады. Вось чаму рана ці позна вам прыйдзецца пісаць ActionScript-код у дадатак да кода на MXML.
У наступным прыкладзе я дадаў код ActionScript унутр MXML-кода кампанента для таго, каб задаць дзве зменныя для захоўвання іх надпісаў на кнопках. Звернеце ўвагу, што я выкарыстоўваю новы тэг, Script, а ўсярэдзіне яго – CDATA. Гэта таму, што ўсярэдзіне XML-дакумента знакі >, < і & недапушчальныя, калі яны не прадстаўлены як escape-паслядоўнасці, а ў нашым Actionscript-кодзе такое можа быць. Акрамя таго, я не буду цяпер завастраць увагу на кодзе ActionScript, пра яго я распавяду падрабязней у наступных частках.
1: <?xml version="1.0" encoding="utf-8"?>
2: <mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="150">
3: <mx:Script>
4: <![CDATA[
5: public var label1:String = "Save";
6: public var label2:String = "Delete";
7: ]]>
8: </mx:Script>
9: <mx:Button id="saveButton" label="{label1}"/>
10: <mx:Button id="cancelButton" label="{label2}"/>
11: </mx:HBox>
Значэнні вызначаных мной зменных могуць быць зададзены з Flex-прыкладанні, які выкарыстоўвае гэты кампанент. Вось код абноўленага прыкладання, які выкарыстоўвае новы варыянт кампанента:
1: <?xml version="1.0" encoding="utf-8"?>
2: <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:local="*" layout="horizontal">
3: <mx:TextInput width="150"/>
4: <local:FormButtons label1="Show" label2="Hide"/>
5: </mx:Application>
Звернеце ўвагу, што тэг FormButtons мае два атрыбуту: label1 і label2. Вось так вы можаце задаць патрэбны тэкст для кнопак. І гэта – той самы механізм, што выкарыстоўваецца для дадання новых паводзін да кампанентаў MXML (з дапамогай кода ActionScript). У рэальным прыкладанні вы маглі дадаць паводзіны для кожнай кнопкі, напрыклад, каб пры яе націску штосьці адбывалася. Выкарыстоўвайце ActionScript-код для напісання функцый, якія будуць выклікацца па націску на кнопку.
Ёсць яшчэ адзін спосаб дадання ActionScript-кода ў MXML. Можна стварыць ActionScript-файл (у гэтым прыкладзе – файл з імем buttons.as) і ўключыць гэты файл у файл MXML. Гэта робіцца шляхам дадання тэга Script з атрыбутам source, паказвальным на ActionScript-файл. Вось код, які ілюструе гэты падыход:
1: // ActionScript file called buttons.as
2: public var label1:String = "Save";
3: public var label2:String = "Delete";
1: <?xml version="1.0" encoding="utf-8"?>
2: <!-- MXML component file called FormButtons.mxml a-->
3: <mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="150">
4: <mx:Script source="buttons.as"/>
5: <mx:Button id="saveButton" label="{label1}"/>
6: <mx:Button id="cancelButton" label="{label2}"/>
7: </mx:HBox>
Зараз зробім крок назад, каб зразумець, што адбываецца, калі кампілятар MXML разбірае файл FormButtons.mxml. Вы ўжо ведаеце, што ўвесь код будзе ператвораны ў ActionScript. Але што адбываецца з існым ActionScript-кодам, які я дадаў (дзве зменныя)? Кампілятар MXML кампілюе кожны MXML-файл у ActionScript-клас. У гэтым выпадку я атрымаю клас c назвай FormButtons (таму што гэта імя файла, і яно выкарыстоўваецца ў якасці імя класа), які пашырае кампанент HBox (таму што я абраў HBox у якасці каранёвага вузла кампанента). І ўсё ActionScript-коды ўсярэдзіне класа становяцца чальцамі класа: зменныя (напрыклад, тыя, што ў прыкладзе) становяцца зменнымі асобніка класа, а функцыі становяцца метадамі гэтага асобніка.
[top]
Стылі CSS
Зараз пацікавімся, як мага змяніць вонкавы выгляд візуальных кампанентаў Flex. Ці ёсць штосьці накшталт CSS для HTML? Так, Flex падтрымлівае CSS. Ва Flex 4 падтрымка CSS пашырана, каб дазволіць вызначаць стылі не толькі для імёнаў класаў, але і для ідэнтыфікатараў (id), а гэта робіць магчымымі псеўда-селектары (напрыклад, для кнопкі (Button) ёсць селектар down, over і т. д.) і шматлікае іншае.
Як і ў HTML, стылі могуць быць вызначаны ўсярэдзіне кода MXML ці ў асобным файле. Цяпер вернемся да нашага кампанента FormButtons і задамо некаторыя стылі. Калі вы вырашылі вызначаць стылі ў асобным файле, то выкарыстоўвайце тэг Style, а шлях да файла стыляў задавайце ў атрыбуце source.
1: <?xml version="1.0" encoding="utf-8"?>
2: <!-- MXML component file called FormButtons.mxml a-->
3: <mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="150">
4: <mx:Style>
5: .Button1 {
6: font-size: 14;
7: color: #990000;
8: }
9: </mx:Style>
10: <mx:Script source="buttons.as"/>
11: <mx:Button id="saveButton" styleName="Button1" label="{label1}"/>
12: <mx:Button id="cancelButton" label="{label2}"/>
13: </mx:HBox>
Я стварыў CSS-клас Button1, у ім вызначаецца колер надпісаў і памер шрыфта. Затым я задаў стыль першай кнопкі з дапамогай яе атрыбуту styleName. Прыкладанне зараз выглядае наступным чынам:
CSS-стылі могуць быць зменены падчас выканання праграмы (пасля таго, як Flex-прыкладанне загрузілася ў браўзар), і вонкавы выгляд прыкладання адразу зменіцца.
Ва Flex 4 Adobe дадала новую мову, званы MXML для графікі -FXG, які дадае графічныя прымітывы, эфекты, маскі і 2D-пераўтварэнні. Можна ствараць клас скіна (скуры) у MXML-файле, выкарыстоўваючы гэтыя новыя тэгі, а затым прызначыць гэты клас кампаненту, які трэба забяспечыць скінам (скурай). Ніжэй паказаны скінаваны спіс Flex 4. Злева паказаны спіс у стане па змаўчанні, а ў правай частцы – стан пры навядзенні мышы (hover). Можна ўбачыць прыкладанне ў дзеянні тут.
Блукаючы па дакументацыі налады выгляду Flex-прыкладанняў, вы можаце сустрэць тэрмін “skinning” – скінаванне, ён ставіцца да працэсу стварэння скінаў – гэта значыць скуры, ці скуркі кампанента. Змяняць знешнасць кампанента можна як чыста графічнымі скінамі, так і з дапамогай праграмнага скінавання. Вось добры артыкул на гэту тэму.
[top]
Змена MXML-кода падчас выканання
Часам трэба змяніць кампаненты інтэрфейсу падчас выканання, “на лёце”. Напрыклад, вы жадаеце, у залежнасці ад атрыманых з сервера дадзеных, пабудаваць на лёце форму. І зноў, каб зрабіць гэта, вы можаце выкарыстоўваць код ActionScript. Любы візуальны Flex-кампанент мае метады для дадання новага даччынага элемента, яго выдаленні, атрыманні ўсіх даччыных элементаў, і г.д. Калі вы жадаеце, можна параўнаць гэта з тым, як змяняецца DOM у HTML з дапамогай JavaScript. Тым не менш, ёсць адрозненне: у JavaScript вы можаце ўключыць атрыманы з сервера HTML-код (выклікам AJAX). Ва Flex гэта немагчыма, і функцыі eval() ва Flex не. Тым не менш, ёсць спосаб загрузкі іншых Flex-прыкладанняў ці Flex-модуляў пасля загрузкі асноўнага прыкладання.
Калі вы ведаеце наперад усе магчымыя станы кампанента, то можна выкарыстоўваць States (станы) у MXML для рэалізацыі ўсіх станаў аднаго і таго ж кампанента. Станы – гэта тая вобласць, дзе Flex 4 значна палепшыў рэалізацыю Flex 3, зрабіўшы працу са станамі значна лягчэй і магутней. Ва Flex 4 станы працуюць так:
- Вы вызначаеце некаторую колькасць станаў і задаяце стан па змаўчанні;
- Вы можаце паказаць, у якім стане павінен з’явіцца пэўны кампанент;
- Вы можаце паказаць асобныя значэнні для любога атрыбуту для кожнага стану, у якім з’яўляецца кампанент.
Выкажам здагадку, вы жадаеце стварыць кампанент, які рэалізуе функцыю аўтарызацыі ў прыкладанні. Вы жадаеце выкарыстоўваць гэты кампанент для адлюстравання формы лагіна, і калі карыстач увайшоў удала, вы жадаеце паказаць кнопку выйсця і імя карыстача. Вось як вы можаце стварыць кампанент Login/Logout ва Flex 4:
1: <?xml version="1.0" encoding="utf-8"?>
2: <s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/halo">
3: <s:states>
4: <s:State name="notlogged"/>
5: <s:State name="logged"/>
6: </s:states>
7:
8: <s:TextInput includeIn="notlogged" text="user name"/>
9: <s:TextInput includeIn="notlogged" text="password"/>
10: <s:Button includeIn="notlogged" label="Login" click="{currentState='logged'}"/>
11:
12: <mx:Label includeIn="logged" text="Current user: Mihai Corlan"/>
13: <s:Button includeIn="logged" label="Logout" click="{currentState='notlogged'}"/>
14: <s:layout>
15: <s:HorizontalLayout/>
16: </s:layout>
17: </s:Group>
Гэты код павінен быць зразумелы сам па сабе. У якасці галоўнага кантэйнера я выкарыстоўваю кампанент Group, які мае гарызантальна-арыентаваную разметку HorizontalLayout (гэта дае той жа эфект, што і выкарыстанне кантэйнера HBox у прыкладзе для Flex 3, прыведзеным вышэй). Я вызначыў даступныя станы для гэтага кампанента напачатку файла. Затым я дадаю тры кнопкі, тэкставыя палі ўводу і пазнаку. Звернеце ўвагу на атрыбут includeIn, паказвальны, у якіх станах з’яўляецца кампанент. Таксама ёсць атрыбут excludeFrom для ўказання станаў, з якіх кампанент выключаецца. Калі вы жадаеце, каб кнопка была ва ўсіх станах, то не паказвайце нічога ў гэтых яе двух атрыбутах. І, вы таксама можаце бачыць, што я прысвоіў выраз атрыбутам click абедзвюх кнопак. Напрыклад, click=”{currentState=’logged‘}” кажа Флексу, што, калі кнопка націснута, трэба змяніць стан кампанента на стан з імем logged.
Я ўключаю ўсё больш і больш кода ActionScript у гэтыя прыклады, хоць я ўсё яшчэ кажу пра мову MXML. Гэта знак да таго, што нетутэйша час прыступіць да другой мовы Flex, мове ActionScript 3.
[top]
Уводзіны ў мову ActionScript 3
ActionScript 3 – гэта дынамічная, аб’ектна-арыентаваная мова сцэнараў, які з’яўляецца (амаль) тыпа-бяспечным (type-safe). ActionScript 3 заснаваны на спецыфікацыі ECMAScript 3 (ECMA-262). Таксама, некаторыя яго магчымасці ідуць у нагу са спецыфікацыяй ECMAScript 4. Я думаю, што лягчэй усяго растлумачыць ActionScript 3 тым, хто з ім зусім незнаёмы, наступным чынам: ActionScript выглядае як сумесь моў JavaScript і Java, плюс яго ўласныя яркія рысы. Насамрэч, JavaScript як мова таксама заснаваны на спецыфікацыі ECMAScript, так што для яго гэта натуральна – мець агульнае з ActionScript.
Як я сказаў раней, Flash Player можа працаваць з дзвюма мовамі: ActionScript 2 і ActionScript 3. Усярэдзіне ён выкарыстоўвае для гэтых дзвюх моў дзве розныя віртуальныя машыны (ActionScript 3 і віртуальная машына AVM2 з’явіліся ва Flash Player 9). ActionScript 3 складаецца з асноўнай мовы (ключавыя словы, тыпы дадзеных, і г.д.) і прыкладнага праграмнага інтэрфейсу Flash Player API (гэты API дае распрацоўнікам доступ да ўсіх магчымасцяў Flash Player праз API дысплея, 3D API, API маляванні, анімацыі, і г.д.) У гэтым артыкуле я сфакусуюся на асноўнай мове. Вось добры ўступны артыкул у ActionScript 3.
З гэтага месца я буду выкарыстоўваць для тэрміна “ActionScript 3″ абрэвіятуру “AS3″.
[top]
Падзел выразаў
У PHP для падзелу выразаў ці пазначэнні іх канца выкарыстоўваецца кропка з коскі (;). У AS3 можна выкарыстоўваць кропку з коскі (;) ці проста знак канца радка. Павінен сказаць, што калі я бачу код без выкарыстання кропкі з коскі, то мае вочы атрымліваюць мала задавальненні. Так што лепш выкарыстоўваць той жа знак кропкі з коскі, што і ў PHP.
[top]
Тыпы дадзеных, зменныя, канстанты
У PHP ёсць такія тыпы дадзеных: Булевы (Boolean), цэлыя лікі, лікі з плывучай кропкай, Радкі (String), Масівы (Array), Аб’екты (Object), Рэсурсы (Resources) і NULL.
У AS3 мы маем:
- Тыпы дадзеных верхняга ўзроўня: Boolean, int, uint, Number (то ж, што і лік з плывучай кропкай у PHP), String, Null (утрымоўвае толькі адно значэнне: null), void (мае толькі адно значэнне: undefined)
- Складаныя тыпы дадзеных: Object, Array, Vector (пачынальна з Flash Player 10), Dictionary, Bitmap, ByteArray, Date, XML, XMLList, Function, Error, RegExp.
У AS3 зменная з’яўляецца проста ідэнтыфікатарам, ці спасылкай на рэальнае значэнне. Дапушчальнымі значэннямі ў AS3 з’яўляюцца аб’ект (int ці uint з’яўляюцца аб’ектамі, тое ж самае з тыпамі Number ці Date), null, і undefined. Значэнні null і undefined пазначаюць адсутнасць дадзеных, тым не менш, паміж імі ёсць адрозненне. Калі вы аб’яўляеце зменную і не ініцыялізуеце яе, яна будзе мець значэнне null, калі гэта не зменная тыпу Boolean, int, uint ці Number. Калі ў зменнай няма тыпу, і яна не ініцыялізавана, яна будзе мець значэнне undefined. У той жа час, калі ў вас ёсць дынамічны аб’ект, і вы жадаеце пераканацца ў тым, што пэўная ўласцівасць ці метад вызначаны, тыя вы можаце правяраць на значэнне undefined.
1: $anInteger = 12;
2: $isTrue = true;
3: $aString = "my string";
4: //or
5: $aString = 'my string';
У AS3 пры аб’яве зменнай выкарыстоўваецца ключавое слова var:
1: var anInteger:int = 12;
2: var isTrue:Boolean = true;
3: var aString:String = "my string";
4: //In AS3 you can not use simple quotes for declaring a String
Заўважце, што пасля імя зменнай я паказаў тып дадзеных; напрыклад, myVarName:Boolean (тып аб’яўляецца з дапамогай двукроп’я “:“, пасля якога варта імя тыпу). AS3 дазваляе вам працаваць, паказваючы тыпы ці не паказваючы іх. Але калі кампілятар працуе ў строгім рэжыме (strict mode), тыя вы абавязаны паказваць тыпы).
Для тых, каго PHP не абавязваў паказваць тыпы зменных, гэта можа здацца дзіўным, і вы можаце захацець па-ранейшаму выкарыстоўваць падыход без указання тыпаў. Як бы панадліва гэта ні было, я настойліва рэкамендую вам выкарыстоўваць аб’явы тыпаў. Па-першае, тыпізацыя зменных дазволіць вам выявіць больш памылак на этапе кампіляцыі пры выкарыстанні інтэграванага асяроддзя распрацоўкі, IDE для напісання кода. Напрыклад, прадстаўце функцыю, якая прымае адзіны аргумент тыпу String. Калі вы паспрабуеце выклікаць гэту функцыю, перадаўшы ёй як аргумент значэнне тыпу Object, то IDE папярэдзіць вас пра гэту памылку.
Без указання тыпаў вы маглі б атрымаць памылку ўжо пры выкананні, калі вы ці канчатковы карыстач працуеце c прыкладаннем, і ў гэтым выпадку чыннік дэфекту было б знайсці нашмат цяжэй.
Другі чыннік для таго, каб прытрымвацца ўказанні тыпаў – гэта здольнасць кампілятара AS3 рабіць аптымізацыі, калі ён ведае пэўныя тыпы зменных.
У PHP вы можаце змяняць тып зменнай пры кожным прысваенні:
1: $myVar = 12; //it is an int
2: $myVar = "now is a string";
У AS3 вы можаце зрабіць тое ж самае (у strict-рэжыме) толькі, калі аб’яўляеце зменную нетыпізаванай, выкарыстоўваючы тып “*”:
1: var myVar:int = 12;
2: //this will raise an error and the application can not be compiled
3: myVar = "this is a string";
4:
5: //declaring the variable untyped you can change the type with each assignment
6: var myVar2:* = 12;
7: myVar2 = "this is a string now";
Вы заўважылі, што я выкарыстоўваю ключавое слова var толькі пры аб’яве зменнай. Пры далейшых прысваеннях var апускаецца.
Як я ўжо згадваў, зменныя ў AS3 з’яўляюцца проста спасылкамі на сапраўдны аб’ект. Але, калі вы прысвойваеце зменную тыпу int, uint, Number, Boolean ці String іншай зменнай, тое ствараецца копія (тое ж самае адбываецца пры перадачы зменнай гэтых жа тыпаў у функцыю). У PHP вы можаце выкарыстоўваць аператар “&”, каб заўсёды перадаваць зменныя па спасылцы нават для простых тыпаў; і калі вы змяняеце значэнне адной зменнай, то іншая будзе паказваць на тое ж самае змененае значэнне.
Для канкатэнацыі (складанні) радкоў у PHP вы выкарыстоўваеце аператар “.” (кропка), а ў AS3 выкарыстоўваецца “+” (плюс):
1: //in PHP
2: $space = " ";
3: $a = "this" . $space . "is!";
4:
5: //in AS3
6: var space:String = " ";
7: var a:String = "this" + space + "is!";
У PHP можна вызначаць зменныя, дзе б вы ні захацелі: на ўзроўні файла, функцыі ці класа. У прыкладаннях Flex зменныя могуць быць абвешчаны толькі ўсярэдзіне функцыі ці на ўзроўні класа.
Да таго ж у PHP вы можаце мець працэдурнае праграмаванне, гэта значыць не абвешчанае як частка функцыі:
1: <?php
2:
3: $a = 1;
4: for ($i=0; $i<100; $i++) {
5: $a += $i * $a;
6: }
7:
8: ?>
У AS3 вы не можаце апераваць зменнымі за межамі функцый (хоць за межамі функцый можна абвясціць зменныя) з адным выключэннем, якое я апішу, калі буду тлумачыць класы. Таму, калі вы паспрабуеце выканаць наступны код, то атрымаеце памылку пры кампіляцыі прыкладання:
1: <?xml version="1.0" encoding="utf-8"?>
2: <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
3: <mx:Script>
4: <![CDATA[
5: var a:int = 1;
6: for (var i:int = 0; i<100; i++) { //this raises an error
7: a += i * a;
8: }
9: ]]>
10: </mx:Script>
11: </mx:Application>
Вось як мага перапісаць код, каб ён працаваў:
1: <?xml version="1.0" encoding="utf-8"?>
2: <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
3: <mx:Script>
4: <![CDATA[
5: var a:int = 1;
6:
7: function calculations(a:int):int {
8: for (var i:int = 0; i<100; i++) {
9: a += i * a;
10: }
11: return a;
12: }
13: ]]>
14: </mx:Script>
15: </mx:Application>
У PHP канстанты аб’яўляюцца і выкарыстоўваюцца так:
1: //constants
2: define("CONSTANT", "Hello");
3: $myString = CONSTANT . ' world!';
У AS3 канстанты аб’яўляюцца з выкарыстаннем ключавога слова const . Ёсць дамова – называць канстанты, выкарыстоўваючы толькі знакі верхняга рэгістра:
1: static const HELLO:String = "Hello";
2: var myString:String = HELLO + " world!";
Што можна выкарыстоўваць у якасці імя зменнай? Тут PHP і AS3 падобныя адзін аднаму: у якасці першага знака імя дазваляецца літара ці “_”, а далей можна выкарыстоўваць літары, лічбы ці знак падкрэслення. Вось прыклады імёнаў зменнай, якія дапушчаюцца ў абедзвюх мовах: _1, _a1A, b.
У PHP вы маеце магчымасць выкарыстоўваць зменную, ведаючы адрас яе радка:
1: <?php
2: $myVar = 12;
3: $varName = 'myVar';
4: echo($$varName); //print 12;
5: ?>
Можна атрымаць той жа вынік і ў AS3, выкарыстоўваючы дынамічны метад указання чальцоў (зменных і метадаў).
1: <?xml version="1.0" encoding="utf-8"?>
2: <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()">
3: <mx:Script>
4: <![CDATA[
5:
6: var myVar:int = 12;
7:
8: function init():void {
9: var varName:String = "myVar";
10: trace(this[varName]); //output 12
11: }
12: ]]>
13: </mx:Script>
14:
15: </mx:Application>
У прыкладзе я выкарыстоўваў this для таго, каб спаслацца на бягучы аб’ект, але вы маглі ўжыць тую ж тэхніку для любога аб’екта. Я спынюся падрабязней на гэтай тэме, калі гаворка пойдзе пра дынамічныя класы.
[top]
Функцыі і ананімныя функцыі (замыканні)
У AS3 можна рабіць з функцыямі ўсё тое ж самае, што і ў PHP, і нават больш.
Па-першае, у AS3 вы можаце вызначыць выгляд аргументаў і які вяртаецца тып (у PHP вы можаце дадаць анатацыю тыпу толькі да метадаў ад аб’ектаў).
1: function calculate(x:int=0, y:int=0):int {
2: return x + y;
3: }
4: //using the function
5: var result:int = calculate(1, 2);
6:
7: function calculateAverage(...arguments):Number {
8: var result:Number = 0;
9: for (var i:int=0; i<arguments.length; i++) {
10: result += arguments[i];
11: }
12: return result/arguments.length;
13: }
14:
15: //using the function
16: var result:Number = calculateAverage(1, 2, 3, 4, 5, 6);
Можна змешваць аператар …(rest) c відавочнымі аргументамі, мясцуючы аператар rest апошнім у спісе аргументаў: function foo(x:int, y:int, …arguments) :Number {} . Аператар rest карысны для стварэння функцый з адвольнай колькасцю аргументаў.
Калі функцыя не вяртае нічога, то ў якасці які вяртаецца тыпу выкарыстоўвайце void.
У PHP і AS3 ёсць значэнні аргументаў па змаўчанні. Напрыклад:
1: //php code
2:
3: function doThing($a, $b="default value") {
4: echo $a . $b;
5: }
6:
7: //AS code
8: function doThing(a:String, b:String="default value"):void {
9: trace(a + b);
10: }
Вядома, вы можаце вызначыць функцыю ўсярэдзіне функцыі (гл. наступны прыклад).
Па-другое, у AS3 любая функцыя ўяўляецца як узор класа Function. Гэта робіць магчымымі некаторыя цікавыя рэчы:
- Вы можаце стварыць літерал функцыі і прызначыць яе зменнай, а затым звярнуцца да функцыі праз гэту зменную (гэта магчыма таксама і ў PHP).
- Вы можаце вяртаць функцыю як вынік дзеяння іншай функцыі.
- Вы можаце перадаваць функцыі як аргументы пры звароце да іншых функцый.
1: var f:Function = function multiply(x:int, y:int):int {
2: return x*y;
3: }
4:
5: trace(f(3,5));
6:
7: function giveMeAFunction():Function {
8: return function multiply(x:int, y:int):int {
9: return x*y;
10: };
11: }
12:
13: var h:Function = giveMeAFunction();
14: trace(h(3,4));
У PHP і AS3 можна ствараць ананімныя функцыі (ці замыканні, closures). У папярэднім узоры кода прадстаўлены прыклад стварэння ананімнай функцыі ўсярэдзіне giveMeAFunction() і яе зварот.
Магчыма, самая вялікая розніца паміж функцыямі ў AS3 і PHP гэта тое, як вы вызначаеце іх. У PHP вы можаце вызначыць у файле любая колькасць функцый. У AS3 вы можаце вызначыць толькі адну функцыю ў файле, і імя функцыі павінна адпавядаць імю файла. Напрыклад, калі вы вызначаеце функцыю doSomeMath(), вам прыйдзецца стварыць гэту функцыю ў файле з імем doSomeMath.as. Для вызначэння функцый аб’яўляйце пакет (пра пакеты вы пазнаяце ў наступнай частцы). Таму, пры стварэнні серыі функцый-утыліт, калі вы не жадаеце пісаць іх у выглядзе мноства файлаў, можаце стварыць адзіны клас і вызначыць гэтыя функцыі, як статычныя метады.
[top]
ООП: Класы і інтэрфейсы
Самы час прыступіць да ООП (Аб’ектна-Арыентаванае Праграмаванне, Object Oriented Programming) асаблівасцям PHP і AS3. У PHP вы можаце пісаць у Ооп ці працэдурным падыходзе; AS3 арыентаваны на аб’екты.
Пачнём з простага PHP-класа, каб убачыць адрозненні ў сінтаксісе (не забывайце, што я выкарыстоўваю PHP 5.3):
1: namespace org\corlan {
2:
3: class SimpleClass {
4:
5: public $public = 'Public';
6: protected $protected = 'Protected';
7: private $private = 'Private';
8:
9: function SimpleClass() {
10:
11: }
12: // Redefine the parent method
13: function displayVar()
14: {
15:
16: }
17: }
18: }
19:
20: //use the class like this
21: require_once('flassFile.php');
22: $obj = new org\corlan\SimpleClass();
23: $obj->displayVar();
У AS3 той жа клас запісваецца наступным чынам:
1: package org.corlan {
2:
3: public class SimpleClass {
4:
5: public var _public:String = "Public";
6: protected var _protected:String = "Protected";
7: private var _private:String = "Private";
8:
9: function SimpleClass() {
10:
11: }
12:
13: // Redefine the parent method
14: public function displayVar():void
15: {
16:
17: }
18: }
19:
20: }
21:
22: //you use the class like this:
23: import org.corlan.SimpleClass;
24:
25: var object:SimpleClass = new SimpleClass();
26: object.displayVar();
Вось галоўныя адрозненні:
Назва файла класа:
- У PHP можна вызначыць клас у файле з адвольным імем;
- У AS3 імя файла павінна супадаць з імем класа (калі клас мае назву SimpleClass, то файл павінен звацца SimpleClass.as ).
Namespace супраць Package, ці прасторы імёнаў супраць пакетаў:
- У PHP вы можаце выкарыстоўваць прасторы імёнаў у пазбяганне канфлікту імёнаў паміж класамі;
- У AS3 выкарыстоўваюцца пакеты; аднак, калі вы аб’яўляеце клас, які знаходзіцца ў пакеце org.corlan, гэта азначае, што клас будзе ўсярэдзіне каталога org/corlan у каталогу зыходнікаў Flex. Імя пакета супадае са структурай каталогаў. Пакеты, выкарыстоўваныя сумесна з мадыфікатарамі доступу да класа могуць схаваць дадзены клас ад класаў за межамі праекта (пра гэта пазней).
Выраз require/includes супраць import:
- У PHP звычайна вы ўключаеце файл класа, выкарыстоўваючы функцыю require_once. Пачынальна з PHP5 можна вызначыць функцыю __autoload() і выклікаць require_once ці include_once у гэтай функцыі замест напісання спісу патрэбных файлаў напачатку кожнага файла;
- У AS3 для ўключэння патрэбнага класа выкарыстоўваецца выраз import. Калі трэба ўключыць усе класы ў пакеце org.corlan, то можна імпартаваць увесь пакет: import org.corlan.*. Яшчэ адно адрозненне ў тым, што кампілятар AS3 уключае толькі тыя класы, якія былі скарыстаны ў вашым кодзе (гэта значыць толькі тады, калі фактычна ствараецца асобнік пэўнага класа).
Уызов метаду/чальца асобніка:
- У PHP выкарыстоўваецца аператар “->” ;
- У AS3 выкарыстоўваецца аператар “.” (dot – кропка) аператар.
А зараз – пра мадыфікатары доступу класаў, метадаў і чальцоў.
Пачнём з мадыфікатараў доступу да класаў:
- У PHP ёсць мадыфікатары final і abstract; мадыфікатара public не, у PHP усе класы – публічныя.
- У AS3 ёсць мадыфікатары public, internal, final і dynamic. Калі вы не паказваеце мадыфікатар доступу (public ці internal), то клас па змаўчанні вызначаецца, як internal, а гэта значыць, што ён даступны толькі для класаў таго ж пакета; рublic і final маюць то ж значэнне, што і ў PHP; мадыфікатар abstract у AS3 адсутнічае, але вы можаце абыйсці гэта абмежаванне, выкарыстоўваючы інтэрфейсы. Мадыфікатар dynamic пазначае клас як клас, які можа быць зменены падчас выканання шляхам змены існых чальцоў ці даданні новых.
Мадыфікатары ўласцівасцяў класа:
- PHP мае: public, private, protected, static
AS3 мае тыя ж мадыфікатары што і PHP плюс internal. Internal выкарыстоўваецца для таго, каб зрабіць уласцівасці даступнымі толькі знутры таго ж пакета. Калі мадыфікатар не паказаны, выкарыстоўваецца internal.
Мадыфікатары для метадаў класа:
- У PHP: public, private, protected, static, final і abstract.
- У AS3: public, private, protected, static, final, internal і override. Abstract не існуе ў AS3; internal робіць метады даступнымі толькі для кода з таго ж самага пакета.
У AS3 можна рабіць з метадамі класа ўсё тое ж самае, што можна рабіць з замыканнямі функцый.
Канструктары у PHP могуць быць пазначаны як дзелі (private), можна вызначыць канструктар з тым жа імем, што і ў класа, а можна выкарыстоўваць адмысловыя метады __construct(), __destruct(). У AS3 канструктар заўсёды публічны і павінен мець то ж імя, што і ў класа. Калі канструктар не паказаны, AS3 стварае канструктар аўтаматычна.
Доступ да статычных чальцоў ці метадам:
- У PHP выкарыстоўваецца ClassName::propertyName.
- У AS3 – ClassName.propertyName. Аднак усярэдзіне таго ж класа імя можна апусціць.
1: package org.corlan {
2:
3: public class Foo {
4:
5: private static myVar:String;
6:
7: function Foo() {
8: Foo.myVar = "value 1";
9: myVar = "value 2";
10: }
11:
12: }
13: }
Аператар this:
- У PHP выкарыстоўваецца адмысловая зменная класа $this, для таго, каб высылацца на чальцоў класа (зменныя і метады) у межах таго ж класа: $this->myVar = 22;
- У AS3 выкарыстоўваецца той жа this: this.myVar = 22; аднак, вы можаце прапусціць this і выкарыстоўваць myVar = 22.
У AS3 толькі адзін клас можа быць абвешчаны ўсярэдзіне пакета (і гэты клас дае імя файлу). Аднак, за межамі пакета вы можаце абвясціць гэтулькі класаў, колькі жадаеце:
1: package org.corlan {
2:
3: public class Foo {
4:
5: private static var instance:Foo;
6:
7: function Foo(object:Bar) {
8:
9: }
10:
11: static public getInstance():Foo {
12: if (Foo.instance == null) {
13: Foo.instance = new Foo(new Bar());
14: }
15: return Foo.instance;
16: }
17:
18: }
19:
20: class Bar {}
Гэта дае цікавы эфект: усе класы, вызначаныя ў файле за межамі пакета, будуць даступныя толькі коду, змешчанаму ўсярэдзіне таго ж файла. Для ўсяго астатняга кода іх не існуе. Памятаеце пра абмежаванне, што ў AS3 нельга абвясціць канструктар як прыватны? Выдатна, тады выкарыстоўваючы тэхніку, падобную гэтаму прыкладу, можна пераканацца ў тым, што ёсць толькі адзін асобнік класа Foo. Калі нейкі вонкавы код выкліча канструктар, з’явіцца выключэнне часу выканання, таму што вонкавы код не можа выкарыстоўваць асобнік Bar, бо гэты клас нябачны да вонкавага кода.
Успадкоўванне
Пашырэнне класаў у AS3 вельмі падобна пашырэнню ў PHP. Выкарыстоўваецца тое ж ключавое слова extends, а пасля яго пазначаецца імя які пашыраецца класа. Перакрыцце робіцца гэтак жа, як і ў PHP, розніца толькі ў тым, што вам прыйдзецца дадаць ключавое слова override да сігнатуры метаду. Перагрузка не падтрымліваецца (нельга мець два метаду з аднолькавымі імёнамі).
У PHP вы звяртаецеся да бацькоўскіх чальцоў, выкарыстоўваючы сінтаксіс parent::memberName ; у AS3 выкарыстоўвайце super.memberName . Калі выконваецца канструктар класа, то спачатку выклікаецца канструктар бацькі. Гэта адбываецца нават тады, калі вы не выклікаеце яго відавочна са свайго кода. Таму, калі ў вас ёсць код у метадзе канструктара, нельга выклікаць бацькоўскі канструктар пасля гэтага кода. Такім чынам, вы даяце магчымасць бацькоўскаму класу правільна ініцыялізавацца, і так даччыны клас не будзе выкарыстоўваць яшчэ не ініцыялізаваныя члены. Звяртайцеся да бацькоўскага канструктара, выкарыстоўваючы сінтаксіс super() .
Давайце праверым гэтыя паняцці ў дзеянні, спачатку код на PHP, затым код на AS3.
1: class SimpleClass {
2:
3: function SimpleClass() {
4: echo('SimpleClass() called');
5: }
6:
7: function __construct() {
8:
9: }
10:
11:
12: function displayVar()
13: {
14: echo "SimpleClass class\n";
15: }
16: }
17:
18: class ExtendClass extends SimpleClass {
19:
20: function ExtendClass() {
21: $myVar = 1;
22: parent::SimpleClass();
23: //or
24: parent::__construct();
25: }
26: // Redefine the parent method
27: function displayVar()
28: {
29: echo "Extending class\n";
30: parent::displayVar();
31: }
32: }
Звернеце ўвагу на тое, як клас ініцыялізуецца ў AS3. Калі ствараецца асобнік класа, то спачатку ініцыялізуюцца ўсе ўласцівасці, затым выконваецца статычны код, вызначаны на ўзроўні класа (гэта менавіта тое, што немагчыма ў PHP), а затым выконваецца канструктар. Прыклад:
1: public class Foo {
2:
3: private var a:int = 0;
4: private static var os:String;
5: trace("initializer");
6:
7: if (Capabilities.os == "LINUX")
8: os = "LINUX";
9: else
10: os = "other";
11:
12: public function Foo(a:int=1) {
13: trace("foo() executed");
14: }
15: }
16:
17: var foo1:Foo = new Foo();
18: var foo2:Foo = new Foo();
19: //produces this output in console:
20: initializer
21: foo() executed
22: foo() executed
У AS3 вы можаце стварыць аб’екты з замыканняў функцый, выкарыстоўваючы ўласцівасць функцыі prototype (гэта падобна звыклай у JavaScript тэхніцы стварэння і пашырэнні класаў). Вось кароткі прыклад:
1: //we create a function
2: function MyClass(value:String = "Mihai") {
3: //we create a property
4: this.name = value;
5: }
6: //we use the special variable prototype of the function
7: //to create another method
8: MyClass.prototype.setName = function (value:String):void {
9: //we have access to the property defined on MyClass object
10: trace(this.name);
11: this.name = value;
12: trace(this.name);
13: }
14:
15: //create an instance
16: var myObject = new MyClass();
17: //accesing the method created earlier
18: myObject.setName("Joe");
Я распавяду больш пра дынамічныя асаблівасці AS3 у наступнай частцы.
Гетары і сетары (getters/setters)
У любым OOP-мове гетары і сетары звычайна выкарыстоўваюцца для кіравання тымі ўласцівасцямі класа, якія вы жадаеце зрабіць бачнымі знадворку. PHP – не выключэнне. Аднак AS3 мае адмысловую падтрымку ўласцівасцяў з дапамогай ключавых слоў get і set. Вось прыклад:
1: public class Employee {
2:
3: private var _salary:int = 0;
4: private var _income:int = 0;
5:
6: function Employee() {
7:
8: }
9:
10: public function set salary(value:int):void {
11: if (value > 0) {
12: this._salary = value;
13: this._income = this._salary * 12;
14: }
15: }
16:
17: public function get salary():int {
18: return this._salary;
19: }
20:
21: public function get income():int {
22: return this.income;
23: }
24: }
25:
26: //using this class
27: var emp:Employee = new Employee();
28: emp.salary = 1000;
29: trace(emp.income);
30: //this raise an error, because the income property is read-only
31: //for the outside code
32: emp.income = 120;
Увогуле, хоць у мяне ёсць гетар і сетар для поля _salary, я магу звярнуцца да гэтых метадаў, як быццам бы яны былі палямі ці ўласцівасцямі, а не функцыямі: object.salary = 20 замест object.salary(20). І калі вы вызначыце толькі гетар, то атрымаеце ўласцівасць, даступнае толькі для чытання. Гэта я і раблю з уласцівасцю _income.
Гэта асаблівасць, акрамя таго, што робіць код трохі чысцей, таксама спрашчае напісанне праграмных інтэрфейсаў прыкладання ці класаў, якія будуць выкарыстоўвацца іншымі, а асабліва – фреймворков і бібліятэк. Прадстаўце, што ў сваім прыкладзе я стварыў поле _salary як публічнае. Калі пазней я вырашыў бы, што мне трэба правяраць задаваныя значэнні, то мне прыйшлося б дадаць сетар. У PHP гэта выглядала б як myObject.setSalary(). У гэты момант любы код, які выкарыстоўвае мой клас, зламаўся б; яго прыйшлося б абнаўляць для выкарыстання з маім сетарам.
У AS3 можна пачаць пісаць клас, вызначыўшы публічная ўласцівасць як public var salary:int, а затым, калі вы вырашыце, што сетар неабходзен, можна пераназваць зменную і дадаць публічны метад public function set salary(). Любы код, які выкарыстоўвае гэты клас, не папакутуе ад гэтых змен, таму што ён па ранейшым працуе з уласцівасцю, выкарыстоўваючы той жа сінтаксіс: objectInstance.salary = 10.
Існуе дамоўленасць – дадаваць падкрэсленне да імя зменнай пры выкарыстанні гэтага стылю гетараў і сетараў у AS3.
Інтэрфейсы
Інтэрфейсы ў AS3 працуюць амаль гэтак жа, як і ў PHP. Адрозненне ў тым, што, хоць у PHP можна вызначыць метады і канстанты, а ў AS3 можна вызначыць толькі метады. Аднак, можна вызначыць сетары і гетары:
1: public interface IEmployee {
2:
3: public function set salary(value:int);
4: public function get salary():int;
5: public function get income():int;
6: }
Выключэнні
Як і ў PHP, у AS3 ёсць падтрымка выключэнняў:
1: try {
2:
3: } catch(e:Error) {
4:
5: } finally {
6:
7: }
8:
9: //throwing an exception
10: throw new Error("Some error");
Error – гэта клас верхняга ўзроўня для ўсіх памылак у AS3. Пашыраючы гэты клас, вы можаце стварыць свае ўласныя памылкі, а можаце выкарыстоўваць існыя падкласы памылак.
Прывядзенне тыпу аб’екта і яго праверка
Часам трэба прывесці аб’ект да іншага тыпу ці праверыць тып. Для праверкі тыпу ў PHP выкарыстоўваецца аператар instanceof, а ў AS3 выкарыстоўваецца is. Для прывядзення тыпу ў AS3 ёсць два розных сінтаксісу.
1: class A {};
2:
3: class B extends A {};
4:
5: var b:A = new B();
6: //casting
7: var c:B = b as B;
8: //or
9: var d:B = B(b);
10:
11: //checking the type of an variable
12: if (b is A)
13: trace(true);
14: if (b is B)
15: trace(true);
[top]
Вобласць бачнасці зменнай
Паглядзеўшы, як зменныя, функцыі і класы працуюць ва Flex і AS3, трэба пагаварыць пра вобласць бачнасці зменных. У PHP галоўным чынам у вас ёсць дзве вобласці: глабальная (зменныя вызначаны на ўзроўні файлаў) і лакальная (зменныя вызначаны ўсярэдзіне функцыі).
Ва Flex існуе пяць магчымых абласцей: цела функцыі, цела метаду асобніка, цела статычнага статычнага метаду, цела класа і глабальная вобласць. Даданне да гэтага мадыфікатараў доступу (публічны/прыватны/абаронены/унутраны – public/private/protected/internal) робіць рэчы трохі складаней, чым у PHP.
Вобласці бачнасці могуць быць укладзены, і ў гэтым выпадку зменныя, функцыі і чальцы якая змяшчае іх вобласці становяцца даступныя ва ўкладзенай вобласці. Напрыклад, у AS3 пры аб’яве ананімнай функцыі ўсярэдзіне іншай функцыі ўсе зменныя, вызначаныя ў вонкавай функцыі, будуць даступныя ўсярэдзіне ўкладзенай. У PHP неабходна перадаваць зменныя, якія вы жадаеце выкарыстоўваць, ці дадаць выраз use (выкарыстоўвай):
1: //php code
2: function a() {
3: $a = 1;
4: $b = 2;
5:
6: function b() use ($a, $b) {
7:
8: }
9: }
10:
11: //AS3 code
12: function a():void {
13: var a:int = 1;
14: var b:int = 2;
15:
16: function b():void {
17: //variables a and b are available here
18: }
19: }
Пры аб’яве функцыі ўсярэдзіне неіменованного пакета яна мясцуецца ў глабальнай вобласці бачнасці і даступная ўсяму коду. Тым не менш, усё, што абвешчана па-за пакетам, усё яшчэ знаходзіцца ў глабальнай вобласці бачнасці, але мабыць толькі коду з таго ж файла.
[top]
Масівы
Масівы ў AS3 вельмі падобныя на масівы ў PHP, але з адным адрозненнем: у AS3 масіў можа мець толькі лікавыя індэксы. Калі вы жадаеце стварыць асацыятыўны масіў, то можаце выкарыстоўваць клас Object. Калі вы жадаеце стварыць хэш-карту, дзе ключамі з’яўляюцца аб’екты (а не радкі), то можна выкарыстоўваць клас Dictionary (Слоўнік). Стварайце масівы з дапамогай класа Array, ёсць таксама шматмерныя масівы. І для аб’екта, і для масіва можна выкарыстоўваць літералы – літаральныя вызначэнні. Разгледзім некалькі прыкладаў:
1: var myArray1:Array = new Array(1, 2, "some string");
2: //creates an array with three elements: 0->1, 1->2, 3->some string
3:
4: //literal definition for an array
5: var myArray2:Array = [1, 2, 3];
6: //ading two more elements
7: myArray2.push(4,5);
8:
9: //a hash map, similar to associative arrays in PHP
10: var myMap:Object = new Object();
11: myMap.name = "Flex";
12: //literal definition of a map
13: var myMap2:Object = {name:"Flex"};
14:
15: //using Dictionary class
16: var dic:Dictionary = new Dictionary();
17: var anObject:Object = new Object(); //creating the key
18: dic[anObject] = "some value"; //adding a value to Dictionary
У вашым распараджэнні ёсць усе чаканыя метады для дадання ці выдаленні элементаў, у тым ліку push, shift, pop, unshift, і splice. Метад concat можна выкарыстоўваць для дадання масіва ў іншы масіў. У папярэднім прыкладзе відаць, як я выкарыстоўваю push для дадання яшчэ двух элементаў у масіў.
Масівы не маюць фіксаванай даўжыні; яны могуць расці па меры дадання новых элементаў. У PHP вы выкарыстоўваеце аператар квадратных дужак “[]“ для дадання новых элементаў у канец масіва. Існуе аналагічны метад у AS3, выкарыстоўвалы ўласцівасць масіва length (даўжыня). Уласцівасць length таксама можна выкарыстоўваць для памяншэння памеру масіва:
1: var array:Array = new Array();
2: array[array.length] = 1;//array has the values: 1
3: array[array.length] = 23;//array has the values: 1, 23
Вы можаце выкарыстоўваць аператар delete для задання пэўнаму элементу масіва нявызначанага значэння: delete array[index]. Гэта не дазваляе скараціць даўжыню масіва. Можна выкарыстоўваць выраз for() для перабору элементаў масіва, выкарыстоўваючы яго ўласцівасць length. Калі вы жадаеце перабраць у цыкле ўласцівасці аб’екта (ізноў жа, гэта можна выкарыстоўваць для імітацыі асацыятыўных масіваў PHP), то можна выкарыстоўваць канструкцыю for … each (якая працуе аналагічна такі ж канструкцыі з РНР) ці for … in (падрабязней пра гэта ў частцы пра дынамічны Actionscript).
[top]
Прасторы імёнаў
Калі вы шукаеце ў AS3 канцэпцыю, эквівалентную прасторам імёнаў у PHP, то вам варта шанаваць пра пакеты ў частцы “Класы”, таму што пакеты ў AS3 – гэта прасторы імёнаў у PHP.
У ActionScript прасторы імёнаў маюць іншы сэнс. Разгледзім тыповыя выпадкі выкарыстання прастор імёнаў, а затым прывядзём некалькі прыкладаў:
- Прадухіленне канфліктаў імёнаў (можна стварыць некалькі метадаў з аднолькавымі імёнамі ў адным і тым жа класе, але кожны метад змясціць у яго ўласную прастору імёнаў).
- Наданне адмысловых налад бачнасці зменным і метадам у фреймворках ці праграмах. Напрыклад, Flex выкарыстоўвае прастора імёнаў mx_internal; выкарыстанне прасторы імёнаў замест мадыфікатара private ці protected дае магчымасць выкарыстоўваць гэтыя метады ў любым пакеце і класе з фреймворка Flex. У той жа час, выкарыстоўваючы гэта прастора імёнаў, распрацоўнікі фреймворка папярэджваюць, што гэтыя метады ці чальцы не прызначаны для выкарыстання знадворку, паколькі яны могуць змяніцца.
- Кіраванне доступам да класа на аснове дазволаў.
- Стварэнне класа, які можа перамыкацца паміж мадэлямі паводзін у залежнасці ад пэўнай абранай прасторы імёнаў.
Перш чым паглыбляцца ў падрабязнасці, я павінен заўважыць, што прасторы імёнаў выкарыстоўваецца ўсярэдзіне Flash Player для рэалізацыі мадыфікатараў доступу public, protected, internal і private (публічны, абаронены, унутраны, прыватны).
Вызначайце прасторы імёнаў, выкарыстоўваючы такі сінтаксіс: namespace ідэнтыфікатар = URI. Ідэнтыфікатар – гэта тое, што вы будзеце выкарыстоўваць пры аб’яве зменных і метадаў, а таксама для пазначэння чальцоў ці метадаў пры іх выкарыстанні. URI – гэта звычайна нейкі URL, які павінен быць унікальным у рамках вашага прыкладання. Ён не абавязаны рэальна існаваць, у большасці выпадкаў вы будзеце выкарыстоўваць сваё даменнае імя. Напрыклад, я б вызначыў прастору імёны так: namespace online = “http://flash-ripper.com /apps/online“.
Вы можаце вызначыць прастору імёнаў у любым месцы, дзе можа быць вызначана зменная: на верхнім узроўні апісання пакета (будзе даступна ўсёй праграме) ці на ўзроўні класа (будзе даступна толькі ў тым жа класе, у якім вызначана). На ўзроўні функцыі можна выкарыстоўваць толькі прасторы імёнаў, якія былі вызначаны ў іншым месцы (гэта можа спатрэбіцца вам для доступу да зменнай, якая была вызначана ў іншым месцы з выкарыстаннем гэтага ж прасторы імёнаў; каб зрабіць гэта, вы павінны ведаць URI).
Можна абвясціць метад ці зменную ў дадзенай прасторы імёнаў, змясціўшы ідэнтыфікатар прасторы імёнаў перад аб’явай зменнай. Напрыклад: mynamespace var a: int = 1. Пры вызначэнні зменнай ці метаду ў прасторы імёнаў нельга выкарыстоўваць іншыя мадыфікатары доступу (напрыклад, private).
Для выкліку зменнай ці метаду, вызначанай у прасторы імёнаў, выкарыстоўваецца аператар наймення прасторы “::”. Выкажам здагадку, вы вызначылі метад myMethod() у прасторы імёнаў online, у гэтым злучвае вы можаце атрымаць доступ да гэтага метаду, выкарыстоўваючы наступны сінтаксіс: objectInstance.online::myMethod(). Тое ж самае – са зменнымі. Часам вам можа спатрэбіцца шмат зменных ці метадаў з аднаго і таго ж прасторы імёнаў. У такім разе вы можаце адкрыць прастору імёнаў у гэтай вобласці бачнасці і такім чынам пазбавіцца ад аператара наймення прасторы “::”. Гэта робіцца з дапамогай дырэктывы use namespace імяпространства. Напрыклад:
1: public function doSomething() {
2: use namespace online;
3: //call the method defined in that namespace:
4: myMethod();
5: }
Вы можаце перадаваць прасторы імёнаў. Напрыклад, можна вярнуць прастору ў метадзе, што дазваляе задзірліваму коду выкарыстоўваць яго для працы з метадамі ці зменнымі.
Зараз давайце створым дзве прасторы імёнаў, якія можна выкарыстоўваць для змены паводзін класа падчас выканання. Па-першае, я вызначу дзве прасторы імёнаў (буду выкарыстоўваць адзін файл для кожнай прасторы імёнаў:
1: // ActionScript file online.as
2: package org.corlan {
3: public namespace online = "http://corlan.org/apps/online";
4: }
1: // ActionScript file offline.as
2: package org.corlan {
3: public namespace offline = "http://corlan.org/apps/offline";
4: }
Затым я буду выкарыстоўваць гэтыя дзве прасторы для стварэння класа, які захоўвае аб’ект. У залежнасці ад статуту падлучэння да Сеткі аб’ект можа захоўвацца лакальна (напрыклад, з дапамогай лакальнага сховішча) ці на выдаленым серверы (з дапамогай REST-сэрвісу). А самае цікавае настае, калі некаторы код выкарыстоўвае гэты клас. Задзірлівы код наогул не пячэцца пра пэўны метад захавання, ён проста жадае захаваць аб’екты.
Выкарыстоўваючы гэтыя дзве прасторы, я ствару клас, які мае два метаду save() у кожным з дзвюх прастор імёнаў. У мяне ёсць прыватная зменная _mode для захоўвання пэўнай прасторы імёнаў, выкарыстоўванага ў залежнасці ад стану падлучэння да Сеткі. Задзірлівая праграма атрымлівае доступ да выкарыстоўванай прасторы імёнаў з дапамогай гетара і выкарыстоўвае гэта прастора для выкліку метаду save(). Ізноў жа, якая выклікае праграма не ведае ні ўсіх гэтых вантроб, ні гэтых прастор імёнаў, ёй усё адно. Паглядзім код PersistObject:
1: package org.corlan {
2: import flash.events.Event;
3:
4: public class PersistObject {
5:
6: private var _mode:Namespace = offline;
7:
8: public function PersistObject() {
9:
10: }
11:
12: online function save(object:Object):void {
13: //save the object back to server
14: trace("online");
15: }
16:
17: offline function save(object:Object):void {
18: //save the object locally
19: trace("offline");
20: }
21:
22: private function connectivityChanged(e:Event):void {
23: //here the mode can be changed from offline to online
24: //and vice-versa
25: }
26:
27: public function get mode():Namespace {
28: return this._mode;
29: }
30: }
31: }
Наступны кавалак кода выкарыстоўвае гэты клас. Ён просты, гледзіце каментары:
1: //creating an object that we want to be stored
2: var object:Object = {book:"Ulysses", author:"James Joyce"};
3: //create an instance of PersitObject
4: var persistenceObject:PersistObject = new PersistObject();
5: //get the current namespace
6: var currentMode:Namespace = persistenceObject.mode;
7: //use the namespace we retrieved to qualify the save method()
8: persistenceObject.currentMode::save(object);
Даступнасць прастор імёнаў
Вы можаце выкарыстоўваць тыя ж мадыфікатары доступу, што і для зменных з метадамі: public, internal, protected і private (для прастор імёнаў, вызначаных на ўзроўні пакета, можна выкарыстоўваць толькі public і internal). Камбінуючы гэта з месцам месцавання вызначэння прасторы імёнаў, вы атрымліваеце большы кантроль над бачнасцю прастор імёнаў у праграме.
[top]
Праца з XML
У PHP ёсць магутная падтрымка XML з дапамогай убудаваных функцый і дадатковых пашырэнняў. У AS3 ёсць два класа, якія ўяўляюць сабой XML першапачаткова: XML і XMLList. У AS3 рэалізацыя класа XML заснавана на W3C DOM (ёсць метады children(), appendChild(), parent(), insertChildBefore() і т. д.). Пры працы з XML добра будзе ведаць пра тое, як выкарыстоўваць E4X (ECMAScript-Для-XML), пашырэнне мовы ECMA-262 у AS3. Клас XML уяўляе XML-дакумент. Кожны вузел дакумента загорнуць у XMLList, нават калі ён мае толькі адзін даччыны вузел.
Можна стварыць XML-аб’ект любым з наступных спосабаў:
- Стварыць XML з дапамогай літерала – літаральнага вызначэння.
- Стварыць асобнік класа XML, а затым імпартаваць XML з вонкавага файла.
- Стварыць асобнік XML і выкарыстоўваць кропкавую натацыю для дадання ці змены структуры:
1: var author:XML = <author/>;
2: author.@id = 1; //setting an attribute called id and its value
3: //adding two child nodes to author:
4: author.name = "Mihai Corlan";
5: author.article = "Flex for PHP developers";
6:
7: //this code is equivalent with:
8: var author:XML = <author id="1">
9: <name>Mihai Corlan</name>
10: <article>Flex for PHP developers</article>
11: </author>;
Выкарыстоўваючы E4X, можна лёгка знайсці вузлы шляхам стварэння ўмоў, заснаваных на імёнах вузлоў ці значэннях атрыбутаў. Можна выкарыстоўваць аператар доступу да нашчадкаў “..” для атрымання ўсіх вузлоў з зададзеным імем (напрыклад, для атрымання ўсіх вузлоў program, можна напісаць: programs..program). Можна стварыць умовы па атрыбутах з дапамогай аператара “@” (напрыклад, programs..program.(@id==2)). І, нарэшце, выкарыстоўваючы кропкавую натацыю, можна перасоўвацца па вузлах (але памятаеце, што любы нашчадак разглядаецца як XMLList, нават калі ён з’яўляецца адзіным нашчадкам). Ніжэй прыведзены прыклады выкарыстання E4X для працы з XML.
1: var programs:XML = <root>
2: <program id="1">
3: <name>Flex</name>
4: </program>
5: <program id="2">
6: <name>ActionScript 3</name>
7: </program>
8: <program id="3">
9: <name>AJAX</name>
10: </program>
11: </root>;
12:
13: //retrieving the second program node and printing its name
14: trace(programs.program[2].name[0]);
15: //retrieving all the program nodes:
16: var list:XMLList = programs..program;
17: //retrieving all the program nodes that have an id attribute equal to 2
18: var list:XMLList = pograms..program.(@id==2);
[top]
Дынамічны ActionScript
Памятаеце вызначэнне AS3? Я казаў, што AS3 з’яўляецца дынамічнай скрыптовай мовай. Давайце капаць трохі глыбей у гэты бок. Дынамічны – азначае, што аб’ект можа быць зменены падчас выканання шляхам дадання ці выдаленні яго метадаў і/ці чальцоў. Можна дадаваць новыя метады самага класа (і любы створаны з гэтага класа аб’ект будзе мець тыя ж метады). Можна нават ствараць новыя класы з нуля (з дапамогай уласцівасці prototype). У AS3 ёсць убудаваныя дынамічныя аб’екты, такія як Object, а ва Flex ёсць яшчэ адзін прыклад, ObjectProxy.
Калі вам цікава, чаму ў AS3 ёсць гэтыя магчымасці, то адказ просты: у ранніх версіях ActionScript не было такога прасунутага ООП, якое ёсць у яго сёння. Трэба сказаць, што, зыходзячы з майго досведу, нешматлікія распрацоўнікі выкарыстоўваюць дынамічныя магчымасці AS3. Для гэтага ёсць некалькі чыннікаў. Па-першае, час доступу да дынамічных чальцоў больш, чым да фіксаваных. Па-другое, у выніку атрымліваецца код, больш уразлівы да памылак (напрыклад, пры кампіляцыі гэтыя памылкі не выяўляюцца).
Вы не абмежаваны ўбудаванымі класамі і можаце ствараць дынамічныя аб’екты з дапамогай мадыфікатара dynamic пры вызначэнні класа:
1: dynamic public MyDynamicObject {
2:
3: }
Зараз пры выкарыстанні гэтага класа можна дадаваць чальцоў падчас выканання (памятаеце, што ўсе дынамічныя зменныя асобніка не маюць тыпу і з’яўляюцца публічнымі):
1: var a:MyDynamicObject = new MyDynamicObject();
2: a.author = "Mihai Corlan";
Можна перабіраць усіх чальцоў дынамічнага класа, выкарыстоўваючы цыкл for-each-in. Вось як паказаць усіх чальцоў з папярэдняга прыкладу:
1: for each (var element:* in a) {
2: trace(element); //displays Mihai Corlan
3: }
Калі вам патрэбныя імёны чальцоў, а не іх значэнні, выкарыстоўвайце цыкл for-in:
1: for (var memberName:* in a) {
2: trace(memberName); //outputs author
3: trace(a[memberName]); //outputs Mihai Corlan
4: }
[top]
Flex асінхронны
Дагэтуль мы разглядалі магчымасці Flex, з якіх шматлікія падобныя з аналагічнымі ў PHP. А вось асінхронная прырода Flex з’яўляецца чымсьці выдатным ад усяго, што ёсць у РНР. Важна зразумець гэта, перастаць з гэтым змагацца і проста аддацца плыні.
Што гэта значыць – Flex з’яўляецца асінхронным? Выкажам здагадку, вы ствараеце Flex-прыкладанне, і пасля яго загрузкі ў браўзар, карыстач можа абраць малюначкі для загрузкі з іншых сайтаў. Можна выкарыстоўваць клас URLLoader для рашэння гэтай задачы. Пры выкананні метаду load() у наступным радку кода ў вас яшчэ не будзе загружаных дадзеных. Выкананне кода не спыняецца пасля выкліку load(), каб дачакацца з’яўлення загружаных дадзеных. Замест гэтага код працягвае выконвацца. Як праграміст, вы працуеце з гэтай асінхроннай прыродай, выкарыстоўваючы ўбудаваную ў AS3 сістэму падзей. Калі вы знаёмыя з праграмаваннем AJAX, то ведайце, што гэта аналагічна выклікам AJAX: вы падаяце функцыю зваротнага выкліку (callback), і калі дадзеныя паступаюць, гэта функцыя выклікаецца, а ў ёй вы можаце атрымаць доступ да ўжо загружаных дадзеных.
Вяртаючыся да прыкладу з ULRLoader, можна дадаць слухач падзеі на падзею result. Гэта функцыя-слухач, будзе выклікана пасля загрузкі дадзеных. Вось прыклад такога кода:
1: function loadPic():void {
2: var loader:URLLoader = new URLLoader();
3: loader.dataFormat = URLLoaderDataFormat.BINARY;
4: //adding the event handlers or listeners
5: loader.addEventListener(EventComplete, picLoaded);
6: loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, picError);
7: //starting the loading
8: loader.load(new URLRequest("http://some_url"));
9: }
10:
11: //event handler for
12: function picLoaded(event:Event):void {
13: //get the data from the loader object
14: //use the target property to get the loader object
15: (event.target as URLLoader).data;
16: }
17:
18: //event handler for the error event
19: function picError(event:IOErrorEvent):void {
20: //displays the error id in a pop-up windonw
21: Alert.show(event.errorID);
22: }
Можна рэзюмаваць гэта так: не тэлефануеце нам, мы вам самі патэлефануем! Гэта т.зв. прынцып Галівуду.
Як я ўжо сказаў, у AS3 ёсць убудаваныя сістэмныя падзеі. Клас верхняга ўзроўня для ўсіх падзей – Event. Усе працавальныя асінхронна аб’екты маюць метад addEventListner(), і яго першыя два аргументу – гэта тып падзеі і імя функцыі, якая будзе выклікацца пры наступе падзеі. Можна падумаць, што да гэтай мадэлі падзей ставяцца толькі аб’екты, злучаныя з атрыманнем выдаленых дадзеных. Насамрэч гэта не так, усе візуальныя кампаненты і аб’екты таксама маюць падзеі. Напрыклад, кожнае Flex-прыкладанне мае падзею creationComplete. Гэта падзея адбываецца, калі ўсе неабходныя кампаненты прыкладання гатовыя да працы і паказаны на экране.
Вам можа здацца, што гэты код не так просты, як у выпадку з PHP, але для асінхронных выклікаў ва Flex (і Flash Player) ёсць добры чыннік: Flex з’яўляецца кліенцкай тэхналогіяй. Калі б усе выклікі былі сінхроннымі, то інтэрфейс карыстача проста завісаў бы кожны раз пры загрузцы дадзеных. А карыстачы не кахаюць якія завісаюць прыкладанні.
Можаце адмяняць некаторыя падзеі і нават змяніць іх паводзіны па змаўчанні. Даю вам магчымасць самастойна вывучыць гэтыя дэталі, калі вам гэта трэба; а зараз у вас павінна быць досыць выразнае ўяўленне пра тое, што такое падзеі і слухачы падзей.
[top]
Прывязка дадзеных, тэгі метададзеных і адлюстраванні
Binding, байндінг, ці прывязка дадзеных – гэта яшчэ адна асаблівасць Флекса, якое палягчае жыццё распрацоўніка, а заадно яна скарачае колькасць радкоў кода. Прывязка дадзеных – гэта элегантны спосаб звязаць паданне дадзеных з іх мадэллю так, каб уяўленне аўтаматычна абнаўлялася пры змене мадэлі.
Бо Flex выкарыстоўваецца для стварэння карыстацкіх інтэрфейсаў, то Flex-кампаненты, як правіла, у выніку адлюстроўваюць вялікую колькасць дадзеных. Пры змене гэтых дадзеных, нават у рэжыме рэальнага часу, звычайна патрабуецца паказаць новыя дадзеныя, а не старыя. Прывязка дадзеных дазваляе вельмі лёгка гэтага дамагчыся. Байндінг злучае ўласцівасць аб’екта (так званая “крыніца”) з уласцівасцю іншага аб’екта (званага “прызначэннем”) і таму, калі змяняецца крыніца, тое прызначэнне таксама аўтаматычна абнаўляецца.
Ва Flex 4 ёсць падтрымка двунакіраванага злучэння, што азначае дзеянне байндінга і ў зваротным кірунку: пры змене прызначэнні яго новае значэнне капіюецца ў крыніца (гэта можна зрабіць і ва Flex 3, але ў два кроку). Двухбаковае злучэнне карысна, калі ў вас ёсць мадэль дадзеных і форма для іх рэдагавання. Вы злучаеце мадэлі з формай, і, калі карыстач змяняе значэнні ў форме, двунакіраваная прывязка абнаўляе дадзеныя мадэлі, выкарыстоўваючы значэнні з формы. Самы час убачыць код:
1: <?xml version="1.0" encoding="utf-8"?>
2: <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="horizontal">
3: <mx:Script>
4: <![CDATA[
5:
6: [Bindable]
7: private var labelValue:String = "Hello World!";
8:
9: private function add():void {
10: labelValue += "!";
11: }
12: ]]>
13: </mx:Script>
14: <mx:Label id="myLabel" text="{labelValue}"/>
15: <mx:Button label="Add a !" click="add()"/>
16: </mx:Application>
Метададзеныя Bindable для зменнай labelValue пазначаюць яе як крыніца для прывязкі дадзеных. Затым я выкарыстоўваю фігурныя дужкі “{}” у атрыбуце пазнакі text, каб адзначыць гэту ўласцівасць як пункт прызначэнні у прывязцы дадзеных. Пасля ўсталёўкі байндінга тэкст будзе змяняцца кожны раз пры змене зменнай labelValue. Я магу выкарыстоўваць гэту ж зменную для шматлікіх пазнак ці палёў уводу, і ўсе яны будуць абнаўляцца з улікам новага значэння.
Існуе таксама MXML сінтаксіс: <mx:Binding source=”labelValue” destination=”myLabel.text”/>.
Калі вы жадаеце прывязаць дадзеныя да элемента формы для рэдагавання значэнняў (напрыклад, элемент уводу тэксту) і капіяваць адрэдагаванае значэнне зваротна ў крыніцу, то ва Flex 4 можна зрабіць двунакіраваную прывязку з абавязковым выкарыстаннем аператара “@”:
1: <s:TextInput id="txt" text="@{labelValue}"/>
І калі вы жадаеце выкарыстоўваць тэг Binding, то задайце яму атрыбут twoWay у true (гэта толькі для Flex 4):
1: <mx:Binding source="labelValue" destination="myTextBox.text" twoWay="true"/>
Для рэалізацыі прывязкі дадзеных Flex дадае падчас кампіляцыі які склейвае код (памятаеце – прывязка дадзеных не з’яўляецца магчымасцю самога Flash Player ці AS3), і прыгажосць у тым тое, што вам не трэба пісаць гэты код самастойна.
Хоць прывязка дадзеных прапануе просты спосаб звязаць мадэль дадзеных з адлюстраваннем, магчыма падзенне прадукцыйнасці, калі ў вас ёсць шмат прывязак да зменных, якія абнаўляюцца дзясяткі ці сотні разоў у секунду. Для такіх зменных няма неабходнасці абнаўляць інтэрфейс карыстача так часта, таму што ёсць мяжа чашчыні кадраў, уведзены ў самым браўзары (дзесьці каля 50 кадраў у секунду). Як вынік – няма сэнсу ў спробах адлюстраваць сотні змен у секунду ў рэжыме рэальнага часу.
Яшчэ адзін момант, пра які трэба памятаць: не ўсе аб’екты могуць удзельнічаць у прывязцы. Напрыклад, аб’ект (Object) і масіў (Array) не могуць быць прывязаны, для іх прывязкі трэба выкарыстоўваць класы ObjectProxie і ArrayCollection. Калі пры стварэнні класа мадэлі дадзеных вы жадаеце, каб усіх чальцы дадзенага класа былі прівязываемымі, то можна змясціць метададзеныя Bindable на ўзроўні класа, а не дадаваць іх да кожнай уласцівасці па асобнасці:
1: package org.corlan {
2:
3: [Bindable]
4: public class VOAuthor {
5:
6: public var id_aut:int;
7: public var fname_aut:String;
8: public var lname_aut:String;
9: }
10: }
Зараз пяройдзем да тэгаў метададзеных (часам званых анатацыямі). Вы ўжо бачылі тэгі метададзеных у выглядзе тэга Bindable. Поўны спіс тэгаў метададзеных Flex ёсць тут. У некаторых выпадках тэгі метададзеных выкарыстоўваюцца кампілятарам MXML для генеравання які склейвае кода (як у выпадку з Bindable), у іншых выпадках вы можаце выкарыстоўваць тэгі метададзеных, каб даць падказку для Flash Builder IDE ці стварэнні ўласцівасцяў MXML-тэгаў. Гэта як раз выпадак з метададзенымі падзеі Event. Напрыклад: выкажам здагадку, што я пішу клас, які генеруе падзеі пры загрузцы. Я магу выкарыстоўваць гэта тэга метададзеных Event для аб’явы тыпу падзеі і яго назвы. Паступіўшы такім чынам, я магу затым выкарыстоўваць уласцівасць movieLoadedEvent MXML-тэга MovieLoader для рэгістрацыі слухача гэтай падзеі. Паглядзім код класа і то, як мага выкарыстоўваць гэты клас у MXML.
1: //class definition
2: package org.corlan {
3: import flash.events.EventDispatcher;
4: import flash.events.IEventDispatcher;
5:
6: [Event(name="movieLoadedEvent", type="flash.events.Event")]
7:
8: public class MovieLoader extends EventDispatcher {
9:
10: public function MovieLoader(target:IEventDispatcher=null) {
11: super(target);
12: }
13:
14: }
15: }
1: <?xml version="1.0" encoding="utf-8"?>
2: <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
3: xmlns:local="org.corlan.*" layout="horizontal">
4: <mx:Script>
5: <![CDATA[
6: private function movieLoadedListener(event:Event):void {
7: //do something with it
8: }
9: ]]>
10: </mx:Script>
11:
12: <local:MovieLoader id="loader" movieLoadedEvent="movieLoadedListener(event)"/>
13: </mx:Application>
З метададзенымі можна рабіць і іншыя цікавыя рэчы. Калі вы ўсталявалі опцыю кампілятара keep-as3-metadata іменаметатэгов, тыя вы можаце дадаць свае ўласныя тэгі, а кампілятар уставіць іх у гатовы байт-код. Затым вы можаце выкарыстоўваць гэтыя тэгі падчас выканання. Напрыклад, у гэтай артыкулу можна прачытаць пра тое, як выкарыстоўваць свае тэгі метададзеных для стварэння магчымасці захоўваць мадэль дадзеных AIR-прыкладанняў (падрабязней пра Adobe AIR трохі пазней).
І гэта падводзіць мяне да апошняй тэмы гэтай часткі: адлюстраванне. Пры выкарыстанні сваіх уласных метададзеных вы павінны належыць на AS3 Reflection API.
У PHP ёсць поўнае аб’ектна-арыентаванае API адлюстраванні: Reflection, ReflectionFunction, ReflectionParameter, ReflectionMethod і гэтак далей. Вось прыклад выкарыстання класа Reflection на простым PHP-класе:
1: class SimpleClass {
2:
3: public $public = 'Public';
4: protected $protected = 'Protected';
5: private $private = 'Private';
6:
7: private function SimpleClass() {
8: echo('SimpleClass() called');
9: }
10:
11: private function __construct() {
12:
13: }
14:
15: function displayVar() {
16: echo "SimpleClass class\n";
17: }
18: }
19:
20:
21: Reflection::export(new ReflectionClass('SimpleClass')); //this outputs:
22:
23: Class [ <user> class SimpleClass ] {
24: @@ /Applications/MAMP/htdocs/_learning/classes.php 7-26
25:
26: - Constants [0] {
27: }
28:
29: - Static properties [0] {
30: }
31:
32: - Static methods [0] {
33: }
34:
35: - Properties [3] {
36: Property [ <default> public $public ]
37: Property [ <default> protected $protected ]
38: Property [ <default> private $private ]
39: }
40:
41: - Methods [3] {
42: Method [ <user> private method SimpleClass ] {
43: @@ /Applications/MAMP/htdocs/_learning/classes.php 13 - 15
44: }
45:
46: Method [ <user, ctor> private method __construct ] {
47: @@ /Applications/MAMP/htdocs/_learning/classes.php 17 - 19
48: }
49:
50: Method [ <user> public method displayVar ] {
51: @@ /Applications/MAMP/htdocs/_learning/classes.php 22 - 25
52: }
53: }
54: }
55:
У AS3 ёсць тры функцыі ў пакеце flash.utils, якія можна выкарыстоўваць для адлюстравання: describeType(), getDefintionByName() і getQualifiedSuperClassName(). Вось прыклад высновы describeType() (высновай з’яўляецца аб’ект XML):
1: public class SimpleClass {
2:
3: public var _public:String = "Public";
4: protected var _protected:String = "Protected";
5: private var _private:String = "Private";
6:
7: function SimpleClass() {
8: trace("SimpleClass() called");
9: }
10:
11: public function displayVar():void
12: {
13: trace("SimpleClass class");
14: }
15: }
16:
17: function reflect():void {
18: var s:SimpleClass = new SimpleClass();
19: var description:XML = describeType(s);
20: trace(description);
21: }
22:
23: //the output:
24: <type name="org.corlan::SimpleClass" base="Object" isDynamic="false" isFinal="false" isStatic="false">
25: <extendsClass type="Object"/>
26: <method name="displayVar" declaredBy="org.corlan::SimpleClass" returnType="void"/>
27: <variable name="_public" type="String"/>
28: </type>
[top]
Дзе мае дадзеныя? Дайце іх сюды!
Як PHP-распрацоўнік, вы маеце прамы доступ да дадзеных, іх аналізу і адлюстраванні на экране. Падлучэнне да базы дадзеных MySQL з’яўляецца адной з першых рэчаў, якой вучыцца PHP- распрацоўнік. Насамрэч, я сумняваюся, што вы здолелі прачытаць увесь артыкул да гэтай кропкі, не зазірнуўшы ў гэту частку .
Што наконт Flex? Я павінен расчараваць вас, таму што ў вас няма прамога доступу да дадзеных, якія захоўваюцца ў БД. Але добра ў гэтым тое, што вы можаце працягваць пісаць PHP-файлы для чытання і запісы дадзеных у базу, нават пры напісанні прыкладанняў на Flex . Чаму ж няма прамога спосабу чытання дадзеных з базы? З-за старой прымаўкі “Ніколі не верце кліенту!” Выкажам здагадку, што кліент – гэта Flex-кампанент, які ўмее падлучацца да сервера MySQL. Як мага захаваць дадзеныя карыстача так, каб іх не было лёгка выкрасці і ўзламаць базу дадзеных? Задаць розныя імёны і паролі для кожнага карыстача і падаць ім гэту інфармацыю? Гэта толькі адна з чыннікаў таго, каб не даваць кліенту тэхналогій падлучэння непасрэдна да сервера баз дадзеных без пасродніцтва сервераў прыкладанняў.
Галоўным чынам, ва Flex-прыкладаннях для кіравання базамі дадзеных вы належыце на серверны скрыпт. Flex прапануе спосаб выкліку старонак з сервера і атрыманні адказу. Ёсць тры розных спосабу падлучэння да сервернай крыніцы дадзеных: сэрвісы ў стылі REST, вэб-сэрвісы і Remoting (ці RPC).
Для выкарыстання сэрвісаў тыпу REST падыходзіць клас HTTPService. Вы можаце адправіць зменныя метадам POST у запыце, а адказам можа быць XML, JSON (ёсць іншыя бібліятэкі для разбору JSON) ці іншыя фарматы.
Калі ў вас ёсць вэб-сэрвісы на серверы (SOAP/WSDL), можна выкарыстоўваць клас WebService.
Але самы цікавы метад – гэта выдалены доступ, ці Remoting з дапамогай класа RemoteObject. Ёсць тры чыннікі лічыць гэты метад самым стромкім. Па-першае, з дапамогай ремоутінга вы можаце выкарыстоўваць любы серверны PHP-клас, выклікаючы яго метады. Галоўным чынам, на боку Flex вы выкарыстоўваеце асобнік RemoteObject, як быццам гэта выдалены клас PHP. Па-другое, можна супаставіць мадэль дадзеных з боку PHP мадэлі дадзеных на боку ActionScript, і пераўтварэнне адбываецца аўтаматычна. Гэта надзвычай важна, таму што пры выкарыстанні тыпізаваных аб’ектаў вы атрымліваеце перавагі праверкі памылак падчас кампіляцыі і завершаны код. Гэта азначае, што код будзе лягчэй чытаць, і ён больш устойлівы да памылак. І, па-трэцяе, фармат паведамленняў для гэтага метаду, AMF3 (Action Message Format) уяўляе сабою бінарны фармат, ён нашмат кампактней і таму перадаецца хутчэй у параўнанні з SOAP/XML/JSON, гэта асабліва важна для вялікіх аб’ёмаў дадзеных. Сам фармат адкрыты, любы ахвотнік можа прачытаць афіцыйную дакументацыю і выкарыстоўваць яго ў сваіх праграмах.
AMF3 хутчэй, таму што ён кадуе дадзеныя. Напрыклад, калі адна і тая ж радок паўтараецца ў наборы дадзеных, то яна кадуецца толькі адзін раз, а ўсе астатнія яе ўваходжанні з’яўляюцца спасылкамі. Калі лік займае менш, чым чатыры біта, тое выкарыстоўваецца толькі мінімальная колькасць патрэбных для яе перадачы байтаў.
Джэймс Уорд (James Ward) з Adobe стварыў добры тэст, для дэманстрацыі адрозненняў паміж Remoting і іншымі метадамі.
Remoting першапачаткова падтрымліваецца ва Flex, аднак на боку сервера сітуацыя некалькі іншая. PHP першапачаткова не падтрымлівае Remoting і AMF3.Таму на серверы патрэбна бібліятэка для выдаленага доступу з PHP на серверы. Ёсць чатыры даступных бібліятэкі, усе яны бясплатныя, і я напісаў кіраўніцтва па выкарыстанні кожны з іх: Zend AMF, PHPAMF, WebORB for PHP і SabreAMF. А тут можна ўбачыць іх параўнанне адзін з адным.
Бо “родныя” тыпы дадзеных канверсуюцца аўтаматычна (тыпы дадзеных PHP – у тыпы AS3 і наадварот), тыя вы павінны звярнуць увагу на тое, як тыпы адной мовы пераўтворацца ў тыпы іншага. Вось прыклад адпаведнасці тыпаў дадзеных у бібліятэцы AMFPHP.
[top]
Аўтэнтыфікацыя карыстача ва Flex-PHP праектах
Бо ж адбываецца аўтэнтыфікацыя карыстача ў праектах Flex плюс PHP? Адказ вельмі просты: як і для любога PHP-сайта, выкарыстоўвайце сесіі і праверку імя карыстача і пароля.
Галоўным чынам, пры выкліку з Flex, ідэнтыфікатар сесіі дадаецца аўтаматычна. Такім чынам, калі карыстач быў аўтэнтыфікаваны раней, то будзе выкарыстоўвацца гэта ж сесія (г.зн. бягучая сесія).
[top]
Праца з праектамі Flex і PHP
Да шчасця, і PHP, і Flex з’яўляюцца спелымі тэхналогіямі, так што ў вас ёсць выбар з масы прылад. Я распавяду пра некаторыя з іх у гэтай частцы.
[top]
Flex SDK і тэкставыя рэдактары
Першы варыянт, які можна разгледзець, складаецца ў выкарыстанні бясплатнага Flex SDK з адкрытым кодам, асабліва калі вы кахаеце працу з каманднага радка і тэкставыя рэдактары тыпу vi . Вы можаце пісаць код у вашым каханым тэкставым рэдактары і выкарыстоўваць сродку каманднага радка для кампіляцыі і адладкі прыкладанняў.
[top]
Flex Builder / Flash Builder і Eclipse PDT / Zend Studio
Я аддаю перавагу выкарыстоўваць сучасныя IDE. Для Flex і PHP-праектаў лепшай камбінацыяй будзе Flex Builder ці Flash Builder 4 і Zend Studio. Flex Builder – гэта назва Flex IDE ад Adobe да чацвёртай версіі, а ў чацвёртай ён быў пераназваны ва Flash Builder 4. Ён заснаваны на Eclipse IDE і даступны для Windows і Mac OS, ёсць яго версія ў выглядзе ўбудовы, а таксама аўтаномная версія. Напрыклад, калі ў вас ёсць Zend Studio, тыя вы можаце паспрабаваць выкарыстоўваць Flash Builder Plug-In і ўсталяваць гэту ўбудову па-над Zend Studio. Вы можаце выкарыстоўваць выпрабавальную версію Flex Builder 3 60 дзён, а Flash Builder 4 знаходзіцца цяпер у предрелізной бэта-версіі (зіма 2010). Калі Вы выкладчык ці студэнт, тыя вы можаце атрымаць ліцэнзію бясплатна.
Калі вы аддаяце перавагу працаваць з Eclipse PDT, тыя вы можаце выкарыстоўваць той жа падыход: усталяваць плагінную версію Flash Builder 4 ці наадварот, усталяваць PDT па-над аўтаномнай версіяй Flash Builder.
Flash Builder 4 прапануе набор майстроў для працы з PHP і Flex: ён можа прааналізаваць PHP-код і згенераваць па ім AS3 і Flex-код падручнік па гэтым пытанні). Можна выкарыстоўваць яго для адладкі, замераў прадукцыйнасці (профайлінга), кампіляцыі і запуску прыкладанняў (вэб ці AIR). Вы таксама можаце экспартаваць релізную версію прыкладання, ёсць таксама падтрымка рэфактарынгу, а таксама рэжым дызайну інтэрфейсу і рэдактар станаў.
Ён таксама інтэгруецца з Flash Catalyst, так што вы можаце ствараць інтэрфейс карыстача ва Flash Catalyst, а затым адкрыць згенераваны праект ва Flash Builder 4 і працягнуць даданне бізнэс-логікі .
Ёсць і іншыя IDE (гэта камерцыйныя прадукты) для Flex: IntelliJ IDEA і FDT (заснаваны на Eclipse).
[top]
Адладка Flex-прыкладанняў
Можна адладжваць Flex-код з дапамогай адладчыка Flex SDK ці адладчыка Flash Builder 4 (ці Flex Builder 3). Калі вы абралі камбінаваную ўсталёўку Flash Builder 4 і Zend Studio, то можна лёгка адладжваць код PHP і код Flex з аднаго і таго ж праекта. Вы робіце выклік з Flex у PHP, а затым можаце ўвайсці ў адладчык PHP, а затым, калі адказ прыйшоў з PHP ва Flex, апыняцеся ў адладчыку Flex. Тут і тут ёсць некаторыя відэа на гэту тэму, а тут ёсць урок па адладцы ў Zend Studio і Flex Builder.
Адзін з маіх першых падыходаў пры адладцы памылак у PHP – гэта выкарыстанне камбінацыі выклікаў die() і var_dump (), каб убачыць, што адбываецца. У AS3 можна выкарыстоўваць trace() для высновы значэнняў зменных на кансоль. Выдатна, што пры кампіляцыі прыкладанняў для рэлізу ўсе выклікі trace() выдаляюцца. Гэта ненадакучлівы спосаб высновы інфармацыі; вы таксама можаце выкарыстоўваць клас Alert для адлюстравання паведамленняў ва ўсплывальным акне (гэта больш падобна на JavaScript да з’яўлення FireBug).
Ключавы момант, які трэба памятаць: зараз у вас ёсць кліент, які адлучаны ад сервера, а праблемы могуць быць як на боку кліента, так і на серверы, ці ж на ўзроўні сеткі.
Вы можаце пазнаць больш пра адладку Flex і PHP праектаў тут.
[top]
Што такое Adobe AIR
Adobe AIR – гэта асяроддзе выканання RIA для працоўнага стала, якая можа выконваць настольныя прыкладанні на Windows, Mac і Linux. З дапамогай AIR вы можаце ствараць адно прыкладанне, якое можа працаваць на любой з гэтых аперацыйных сістэм. Прыклады AIR-прыкладанняў: Tour de Flex, TweetDeck, Times Reader, Dojo Toolbox, і Sideline from Yahoo!.
Вы можаце ўявіць сабе Adobe AIR як Flash Player для працоўнага стала. Разам з гэтым, Adobe AIR – гэта больш, чым проста мадыфікаваны Flash Player.
Усярэдзіне гэтага асяроддзя выканання ёсць HTML-рухавічок (WebKit, той жа рухавічок выкарыстоўваюць Safari і Google Chrome) і мадыфікаваны рухавічок Flash Player. Абодва гэтыя рухавічка даюць набор праграмных інтэрфейсаў, якія прадстаўляюць доступ да машыны, на якой запускаецца AIR-прыкладанне. Ёсць API для запісу і чытанні файлаў з дыска, для выяўлення сеткавых падлучэнняў, для выяўлення колькасці падлучаных манітораў і дазволы экрана, для аўтаматычнага абнаўлення прыкладанняў, для апавяшчэнняў працоўнага стала, для працы з лакальнымі базамі дадзеных і зашыфраваным лакальным сховішчам, для перацягвання аб’ектаў мышкай паміж прыкладаннем і дэсктопам і шматлікае іншае.
Як вэб-распрацоўнік, вы можаце абраць любую камбінацыю з наступных тэхналогій: Flex, ActionScript 3, ці HTML/CSS/JavaScript. Так, гэта так, вы можаце стварыць AIR-прыкладанне, выкарыстоўваючы толькі HTML, JavaScript і CSS! Насамрэч, прыкладанні Dojo Toolbox і Sideline ад Yahoo! створаны з дапамогай HTML/CSS/JS.
Так што з AIR вы можаце выкарыстоўваць свае існыя навыкі для стварэння настольных прыкладанняў. Але чаму вам можа спатрэбіцца ствараць вэб-прыкладанне, якое працуе як настольнае? Насамрэч, для гэтага ёсць шмат чыннікаў:
- Вы жадаеце мець магчымасць выкарыстоўваць прыкладанне ці яго часткі, калі ў вас няма падлучэння да Інтэрнэту.
- Вы жадаеце пазбавіцца ад хрому браўзара і цалкам кантраляваць вонкавы выгляд вашага прыкладання.
- Вы жадаеце мець магчымасць інтэграваць ваша прыкладанне з іншымі прыкладаннямі на кампутары карыстача (напрыклад, для перацягвання файлаў з AIR-прыкладанні на працоўны стол і наадварот).
- Вы жадаеце захоўваць файлы на кампутары карыстача.
- Вы жадаеце стварыць сістэму абвестак і жадаеце запускаць прыкладанне згорнутым у сістэмны трэй (напрыклад, аська можа паведамляць вам пра новае паведамленне нават калі яна згорнутая ў трэй і не мае фокусу).
- Маса іншых чыннікаў, выкліканых магчымасцю хуткай рэалізацыі вашых уласных інавацыйных ідэй для дэсктопа.
Для распрацоўкі AIR-прыкладанняў можна выкарыстоўваць бясплатны AIR SDK (там ёсць прылады каманднага радка для стварэння, тэставанні і адладкі прыкладанняў), а таксама вы можаце выкарыстоўваць Aptana Studio для стварэння AIR-прыкладанняў на HTML/JS/CSS, а можна рабіць AIR ва Flash Builder 4 ці Flex Builder 3.
Нарэшце, любое Flex-прыкладанне, якое было створана для браўзара, можа быць канвертавана ў AIR-прыкладанне вокамгненна. Вядома, калі вы на гэтым спыніцеся і не станеце выкарыстоўваць магчымасці AIR, тое гэта не мае сэнсу, бо вы не падалі карыстачу прыкладання ніякай дадатковай каштоўнасці ў такой настольнай версіі, так што варта падумаць пра гэта.
[top]
Што будзе з Flash далей?
Напачатку 2010 года выйдзе Flex 4. Adobe распрацавала новую прыладу Flash Catlyst (Каталізатар Флэша, ён яшчэ ў бэта-версіі), які можна выкарыстоўваць для пераўтварэння створанага ў Photoshop ці Illustrator статычнага дызайну ў функцыянальныя інтэрфейсы карыстача Flex-прыкладанняў. Уявіце сабе прыладу, на ўваходзе прымалы файл у фармаце Photoshop ці Illustrator, а на выйсці давальны HTML/CSS/JavaScript-код, пры гэтым захоўваючы дызайн і задума зыходных файлаў. Гэта тое, што робіць Flash Catalyst, толькі ён выводзіць код для Flex 4, а не HTML.
У той жа час, мы cконцентрірованы на тым, каб платформа Flash была даступная на любых экранах: ад кампутараў да мабільных прылад, ад прыставак для відэагульняў да тэлевізараў. Зараз у нас ёсць Flash Lite 3, даступны на мабільных тэлефонах Nokia, Sony Ericsson, HTC, Android і Palm. У наступным годзе мы выпусцім мабільную версію Flash Player 10.1 з падтрымкай Multi-Touch, акселерометра і іншых карысных рэчаў. Акрамя таго, цалкам магчыма, што ў наступным годзе мы ўбачым першыя тэлевізары з падтрымкай Flash. Як стромка будзе мець у тэлевізары інтэрфейс карыстача з усімі перавагамі Flash Player, ці глядзець відэа высокага дазволу з Сеткі (Flash падтрымлівае стандарт Н.264). Некаторыя аналітыкі лічаць, што ў найблізкай будучыні падлучаных да Інтэрнэту мабільных тэлефонаў стане больш, чым кампутараў, і шматлікія людзі будуць выкарыстоўваць свае мабільныя ў якасці асноўнага сродку доступу да Інтэрнэту, паколькі ў іх не будзе кампутара.
Што гэта азначае для вэб-распрацоўніка? Гэта азначае, што вы можаце пашырыць сваю сферу кампетэнцыі і сферу вашых бізнэс-прапаноў – ад вэб-сайтаў да RIA на працоўным стале (з дапамогай Adobe AIR), і ад кампутараў да мабільных тэлефонаў і іншых прылад з экранамі. Вядома, для таго, каб зрабіць гэта, вам трэба асвяжыць у памяці некаторыя з вашых навыкаў, але гэты ўзровень складанасці нават блізка не падыходзіць да ўзроўня засваення адмысловасцяў тыпу C ці C++ для дадзенай платформы.
[top]
Куды зараз ісці і што зараз рабіць
Спадзяюся, вы знайшлі адказы на некаторыя свае пытанні. Калі вы сур’ёзна маюць намер увайсці ў свет Flex, то вось некаторыя рэсурсы:
Tour de Flex
Я бачу Турдефлекс як Web 2.0 ці РІА-версію каханага php_manual.chm. Вы можаце ўсталяваць яго тут. Ён дае прыклады выкарыстання ўсіх Flex-кампанентаў, там можна ўбачыць, як яны выглядаюць, і выкарыстоўваны для гэтага код. Там таксама ёсць лёгкі доступ да дакументацыі па Flex. Само прыкладанне створана з дапамогай Flex і Adobe AIR.
Кнігі
Ёсць шмат кніг о Flex і ActionScript 3, а мае асабістыя фаварыты, і тыя, я звычайна рэкамендую, такія:
- First steps in Flex, ад Бруса Эккеля (Bruce Eckel) і Джэймса Уорда (James Ward – тэхнічны евангеліст у Adobe); гэта кніга дае агляд магчымасцяў Flex для распрацоўкі вэб- і настольных прыкладанняў, і вы можаце прачытаць яе за адны выходныя.
- Асновы ActionScript 3.0 на рускай мове ад Коліна Пакута (Colin Moock); гэта тоўстая кніга, і вы павінны быць выдатным чытачом, каб прачытаць яе за выходныя. Хоць яна не пакрывае Flex, у ёй можна пазнаць амаль усё пра ActionScript 3.
Сайты
Існуюць сотні сайтаў і блогаў пра Flex і ActionScript 3. Немагчыма даць поўны спіс, дам некаторыя з маіх каханых:
- Adobe Developer Connection. Выдатнае месца для чытання тэхнічных артыкулаў о Flash, Flex і AIR. Абнаўляецца штотыдзень. Існуе частка, прысвечаны Flex і PHP.
- Adobe TV. На гэтым сайце ёсць тысячы кубаметраў відэа з дакладамі канферэнцый і відэа-ўрокамі.
- Gotoandlearn.com. Выдатная калекцыя відэа-ўрокаў ад іншага евангеліста – Лі Брімелоу (Lee Brimelow).
- Flex-дакументацыя. Майце на ўвазе, што вы можаце запампаваць ZIP-файл гэтай дакументацыі. Тут вы знойдзеце рэсурсы ў розных фарматах.
- Групы Adobe. Гэта адкрытая платформа, дзе можна знайсці групы карыстачоў Adobe, у тым ліку Flex- і Flash- групы. Вось расійская група RAFPUG, а вось украінская UAFPUG, а вось – беларуская BAFPUG. Праверце, ці няма групы карыстачоў у вашым рэгіёне, звычайна яны арганізуюць паседжанні штомесяц і ў розных гарадах. На сайце груп ёсць форумы, на іх падтрымліваецца лакалізацыя, так што там вы знойдзеце змесціва не толькі на ангельскім.
- Мой блогролл. Пагледзіце там; большасць з гэтых людзей працуюць для Adobe, яны пішуць о Flash і Flex.
- Пагледзіце на гэты спіс, які падтрымлівае аўтар артыкула Міхай Корлан. Там ёсць фреймворкі, бібліятэкі і іншыя Flex-рэсурсы.
Зараз, я думаю, вы можаце зразумець, чаму, калі распрацоўнік пытае мяне, што такое Flex, я некаторы час проста тупа гляджу ў прастору. За гэты час перад маімі вачамі праходзяць усе тысячы слоў, што я напісаў тут… так шмат можна сказаць, і як паскладаць гэта ўсё ў адзін радок!? Спадзяюся, зараз я магу проста адказаць “Флекс – гэта дзіўна, чувак! Зірні вось гэты артыкул “.
Калі ў вас ёсць каментары, калі ласка, знайдзіце час, каб пакінуць іх на гэтай старонцы ці на старонцы ангельскай версіі артыкула. Дзякуй!
[top]
