变量作用域
前面我们已经了解了变量、函数和类是如何在Flex 和AS 3中工作的,现在是讨论变量作用域的时候了。在PHP中,通常你具有两个作用域:全局(global)(在文件级别定义的变量)和本地(local )(在函数内部定义的变量)。
在Flex中,共有5个作用域:函数体(function body)、实例方法体(instance method body)、静态方法体( static method body)、类体(class body)和全局作用域(global scope)。向这些作用域添加访问修饰符(public/private/protected/internal)使得事情比在PHP中变得更为复杂。
作用域可以嵌套。在本例中包含的作用域的变量/函数/成员均可以被嵌套的变量/函数/成员使用。例如,当你在另一个函数体的内部声明一个匿名函数时,在AS3中,所有在外部函数定义的变量可以在嵌套函数的内部使用。在PHP中,你必须传递你希望使用的变量,或添加use 语句:
当你在一个未命名类包的内部声明一个函数时,其将被放置在全局作用域之中并且其对所有代码均为可用的。然而,尽管在一个类包之外声明的任何函数仍然位于全局作用域,但其只能对来自相同文件对代码是可见的。
数组
在AS3中,数组与PHP的情况非常相似,仅有一处差异:在AS3中,一个数组仅具有数字下标。如果你希望创建一个关联数组,你可以使用Object 类。如果你希望创建一个key是对象(而非字符串)的哈希图(hash map)时,你可以使用Dictionary类。你可以使用Array 类创建数组,也可以创建多维数组。对于Object 和Array ,你均可以使用文字定义。让我们来看看若干范例:
你具有添加元素或删除元素的所有期望的方法,包括push、shift、pop、unshift和 splice。Concat 可以用于将数组添加至另一个数组。在前面的范例中,你可以看到我是如何使用 push 来添加另外两个元素至一个数组。
数组具有不固定的长度。其长度随着你添加更多元素而增加。在PHP中,你可以使用“[]” 在数组的结束部分添加一个新的元素。AS3具有相似的方法,该方法使用数组的length 特性(property )(你也能够使用length 特性(property )来声明数组的长度)。
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 将数组的一个特定元素设置为undefined:delete array[index]。这一操作将不会缩短数组的长度。你可以使用for() 语句并且利用其length 特性(property )对数组进行循环操作。如果你希望对一个Object进行循环操作(这可以用于创建与PHP关联数组相似的数组),你可以使用for – each (其工作方式与PHP中相同的构造器相似) 或 for – in 语句(在 动态(Dynamic)章节将会更多地对其进行讨论 )。
命名空间
如果你希望寻找与PHP命名空间对等的AS3概念,你应该阅读类(Classes)章节关于类包的内容,因为AS3类包与PHP命名空间是相似的。
在ActionScript中,命名空间具有不同的含义。让我们来看看命名空间可以用来干什么,然后,我将给出若干范例:
1. 防止命名冲突(你可以在相同的类中创建具有相同名称的多个方法,每个方法存储于不同的命名空间)
2. 向自定义visibility设置标示跨框架/程序的变量和方法(例如,Flex使用一个名称为mx_internal的命名空间;使用该命名空间而不使用private 或 protected使得使用这些来自Flex框架的跨类包和类的方法成为可能。同时,开发人员将被警告这些方法或成员不一定能够被外部使用,因为它们可能会改变)
3. 实现基于许可的类的访问控制功能
4. 创建能够基于特定选择的命名空间来改变其行为的类
在详细讨论命名空间之前,我们应该注意到命名空间可以被Flash Player 内部使用以实现访问修饰符:public、protected、internal和 private。
你可以使用语句namespace identifier = URI定义一个命名空间。当你声明变量/方法以及希望限定一个成员或方法以便使用它时,你应该使用标识符。URI 通常是一个 URL ,该URL对于你的应用程序来说必须是唯一的。它并不是必须存在的,并且在大多数情形下,你应该使用你的域名。例如,我可以定义一个如下形式的命名空间:namespace online = “http://corlan.org/apps/online”。
你可以在能够定义变量的任何位置定义命名空间:在类包定义的顶层(它在整个程序中均可用),或在类级别(它只能在定义它的类中可用)。在函数级别,你只能使用在其它位置定义的命名空间(你可能需要这样做以便限定一个在其它位置使用相同命名空间定义的变量;你需要知道相应的URI以便进行限定)。
你可以通过在相应声明之前放置命名空间标识符,在一个给定的命名空间中声明一个方法或变量。例如:mynamespace var a:int = 1。当你在一个命名空间中定义一个变量或方法时,系统不允许你使用其它访问修饰符(例如private )。
为了调用在一个命名空间定义的变量或方法,你可以使用命名修饰符运算符“::”。假设你在一个名称为online的命名空间中定义了一个名称为myMethod() 的方法,你就可以使用语句objectInstance.online::myMethod() 访问该方法。对变量来说,情形也是相同。有时,你可能需要使用那些利用命名空间名称限制的变量或方法。你可以在相应的作用域打开该命名空间并且摆脱该命名修饰符运算符的限制。你可以使用use namespace namespaceidentifier 指令实现这一目的。例如:
1: public function doSomething() {
2: use namespace online;
3: //call the method defined in that namespace:
4: myMethod();
5: }
你可以传送命名空间,例如,你可以从一个方法中返回一个命名空间,以便允许该调用代码使用它来限定一个方法或成员。
现在,让我们来创建两个命名空间,它们可以用于在运行时改变类的行为。首先,我将定义这两个命名空间(我将为每个命名空间提供一个文件):
接下来,我将使用这两个命名空间创建一个能够存储一个对象的类。根据其链接状态,该类可以在本地存储该对象(例如,使用本地存储设备),或以远端方式在服务器上存储该对象(使用REST服务)。当某些代码需要使用该类时,有趣的部分将会出现。该调用的代码完全不关心该方法,它只希望将该对象存储起来。
通过使用这两个命名空间,我将创建一个类,该类具有两个名称均为save()的方法,每个方法定义于其中一个命名空间。下一步,我将创建一个私有变量,该变量存储了当前的命名空间,根据因特网连接的状态可以使用该命名空间。调用程序可以使用getter访问当前命名空间,并且使用它来调用save() 方法。再一次强调一下,调用程序不知道所有的这些internal,而且不知道这些命名空间,它也不关心这些命名空间。让我们看一下PersistObject 代码:
下面的代码片段使用了该类。该代码段非常简单,并且行内的注释给出了说明。
命名空间可访问性
你可以使用与变量或方法相同的访问修饰符:public, internal, protected和 private (对于在类包级别定义的命名空间,你可以只使用 public 和internal)。将这一点与命名空间定义的位置结合起来,你将对程序中命名空间的可见性具有很强的控制能力。
与XML的配合
在PHP中,通过本机函数或附加扩展对XML提供了大量支持功能。在AS3中,本机有两个类可以表示XML:XML 和XMLList。AS3能够基于W3C DOM (你可以使用像 children()、appendChild()、parent()、 insertChildBefore() 等方法) 实现XML类。当你利用XML进行编程时,你应该了解如何使用E4X。E4X (ECMAScript-for-XML) 是 ECMA-262 语言的一种扩展,该扩展是通过AS3实现的。你可以使用XML来表示一个XML文档。即使在只有一个子类的情形下,任何来自该文档的节点都将包含于一个XMLList。
你可以使用下列任何方法创建一个XML对象:
1. 使用文字形式编写XML。
2. 创建一个XML实例,然后从一个外部文件导入该XML实例。
创建一个XML实例,然后使用点记法(dot notation)以便添加/改变相应的结构:
通过使用E4X,你可以根据基于节点名称或属性值的创建条件很容易地找到节点。你可以使用递减运算符 “..” 查询具有给定名称的所有节点(例如,为了查询所有程序节点,你可以使用语句:programs..program)。你可以使用“@” 运算符 (例如, programs..program.(@id==2))创建基于属性的条件。最后,通过使用点符号,你可以在节点之间浏览(应该记住即使在只有一个子类的情形下,任何子类均被看作一个XMLList)。下面你将看到使用E4X与XML配合的范例:
动态ActionScript
还记得AS3的定义吗?在该定义中,我给出了AS3是一种动态脚本语言的陈述。让我们更进一步地讨论该功能。动态表示通过添加或删除方法或成员可以在运行时修改一个对象。系统能够将新的方法添加至类的本身(并且任何由该类创建的对象将具有这些方法)。你甚至可以从头创建新类(使用protoype 特性(property))。AS3具有内置的动态对象,例如Object,而Flex具有另一个动态对象例子:ObjectProx。
如果你想知道为什么该功能首先出现,其答案是非常简单的:ActionScript的早期版本不具有AS3今天提供的所有功能和OOP。我必须说明,以我的经验来看,没有多少开发人员使用AS3的动态功能。这里有下面几个原因。首先,动态成员的访问速度要慢于固定成员。其次,你的代码更易于出现软件缺陷(例如,没有编译时间错误检查)。
你可以不局限于使用内置类;你能够在类定义中使用dynamic 修饰符创建动态对象:
1: dynamic public MyDynamicObject {
2:
3: }
现在,通过使用你刚才定义的类,你可以在运行时添加成员(记住所有动态实例变量均为untyped 和public):
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: }
Flex是异步的
到目前为止,我们已经讨论了许多Flex功能,并且其中大部分功能与其PHP的对等部分非常相似。但是,Flex的异步特性与PHP相比具有相当的差异。停止与之对抗并且顺其自然,了解这一点非常重要。
“Flex是异步的”这句话的含义是什么?假设你创建一个Flex应用程序,并且在该应用程序载入浏览器之后,用户可以选择从另一个站点下载图片。你也许使用一个URLLoader 类来实现这一任务。当你执行load() 方法时,在代码的下一行,你将不会拥有相应数据。在load() 调用等待相应数据已经载入之后,脚本不会暂停。取而代之的是脚本的执行将被恢复。作为一个程序员,你可以使用内置的AS3事件系统处理这一异步特性。如果你熟悉AJAX编程,这与你在执行一个AJAX调用时所做的事情相似:你提供一个回调函数,并且当数据到达时,该回调函数将被调用并且你可以访问相应的下载数据。
回到ULRLoader 范例,你可以为result 事件添加一个事件侦听器。这是一个函数,当数据载入之后,它将被调用。
我从上面代码得出的功能概述是:别调用我们,我们将调用你们!
正如我在前面所述的那样,AS3具有内置的事件系统。所有事件的*类是Event。所有异步工作的对象均具有addEventListner() 方法,并且前面两个自变量为事件类型,以及在事件发生时被调用的函数的名称。你可以认为只有处理检索的远端数据的对象才遵从该事件模型。实际的情况并非如此;所有可见的组件或对象也具有各种事件。例如,每个Flex应用程序具有一个creationComplete 事件。当所有应用程序要求的组件被处理并且在屏幕上绘制之后,该事件将被触发。
尽管你可能感觉这样的代码不如PHP的代码简单易懂,但对于在Flex(以及Flash Player)中随处可见的异步调用来说,这里具有一个恰当的理由:Flex是一种客户端侧技术。例如,如果所有调用均为同步调用,则应用程序的用户界面将会停止对涉及下载数据的调用的响应。而用户非常厌恶不能对用户界面及时响应。
你可以删除一些事件,甚至能够改变其默认行为。如果你愿意,我将让你自己研究这些详细内容。从现在开始,你应该对什么是事件和事件侦听器具有相当清晰的理解。
数据绑定、元数据标签和反射
数据绑定是另一个能够使得开发人员的生活更为轻松的Flex功能,并且同时能够减少代码的行数。数据绑定是一种能够将数据模型与视图进行绑定的很好方法,并且能够自动更新视图以反映任何数据模型的变化。
因为Flex可以用于创建应用程序的用户界面,因此Flex组件通常是以显示大量数据的方式结束的。当数据被修改时,甚至在实时修改的情形下,通常,人们希望显示最新的而不是老旧的数据。通过使用数据绑定功能,你能够轻松地实现这一目标。数据绑定可以将一个对象的特性(property)(称为源)与另一个对象的特性(property)(称为目的地)进行链接,因此,每当源改变时,相应的目的地将自动更新。
Flex 4支持双向绑定功能(实际上Flex 3也支持该功能,但你需要在第二步对其进行声明),这意味着绑定功能在另一个方向也能起作用:即当目的地被更新时,新的值将被复制到相应的源。当你具有一个数据模型和一个表单时,这是非常有用的。你可以将数据模型与表单进行绑定,然后当用户改变表单中的值时,双向数据绑定功能将会利用表单的值来更新数据模型。现在,让我们来看看一些代码:
labelValue变量的Bindable 元数据可以将其标示为数据绑定的源。下一步,我对Label 的文本属性使用了“{}” 符号以便将该特性(property )标示为该绑定的目的地。在设置绑定功能之后,每当变量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在编译时间添加了胶水代码(glue code )(记住数据绑定不是Flash Player 或 AS3的功能),这样做的美妙之处是你不需要自己编写该代码。
尽管数据绑定功能为数据模型与视图的绑定提供了一种简单易懂的方法,但是,如果你具有大量的变量绑定,并且它们每秒更新数百次,则会对性能产生影响。对于这样的变量,没有必要对用户界面进行如此频繁的更新,因为对浏览器自己执行的每秒帧数(大约每秒50帧)有相应的限制。因此,试图每秒实时显示数百次变更是毫无意义的。
另一个需要记住的事情是并不是所有的对象均为可绑定的。例如,Object 和Array 都不是可绑定的,因此,你应该使用ObjectProxie 和ArrayCollection。当你创建类以便为数据建立模型时,如果你希望该类的所有成员均为可绑定的,则你应该将Bindable 元数据放置在类级别之上,而不是为每个特性(property)添加Bindable 元数据:
现在,让我们讨论一下元数据标签(有时称为注解)。你已经看到了以Bindable 元数据标签的形式出现的元数据标签。如需获得你能够在Flex中使用的元数据标签的完整列表,请点击这里。在一些情形下,MXML编译器可以使用元数据标签以便产生胶水代码(如在Bindable的情形下),而在另一些情形下,你可以使用元数据标签来向Flash Builder IDE发送示意,或在MXML标签中创建特性(property)。这是Event 元数据的情形。例如,假设我编写一个类,它能够在载入一个电影时抛出一个事件。我可以使用Event 元数据声明该事件的类型和名称。之后,我可以使用MovieLoader MXML 标签的movieLoadedEvent 特性(property)来为该事件注册事件侦听器。让我们看看该类的代码以及如何在MXML中使用该类。
这里还有其它与元数据相关的有趣事情。如果你在编译器上设置一个标志(keep-as3-metadata 后面跟随一个标签的名称),则你可以添加你的自定义元数据标签,并且编译器将会把这些标签放入字节代码(bytecode)中。之后,你可以在运行时使用这些标签。例如,点击这里,你可以阅读到如何使用自定义元数据标签为在一个AIR应用程序中存储一个给定数据模型提供一种方法(稍后将更多地讨论Adobe AIR )。
现在,我们将讨论本节的最后一个话题:反射。为了能够使用自定义元数据,你必须依靠AS3反射API。
在PHP中,存在一个完整的面向对象的反射API系列:其中包括Reflection、ReflectionFunction、ReflectionParameter、ReflectionMethod等等。下面是一个在简单PHP类之上使用Reflection类的范例:
在AS3中,可以用于反射的flash.utils 类包具有3个函数:describeType()、getDefintionByNameI() 和getQualifiedSuperClassName()。下面是一个describeType() 输出的范例(该输出是一个XML对象):
我的数据在哪里?将它显示出来!
作为一个PHP开发人员,你可以使用非常直接的方法读取数据、解析数据并且将这些数据在屏幕上显示出来。连接MySQL数据库是每一个PHP开发人员需要学会的第一件事情。实际上,我非常怀疑你能够一直阅读通篇文章至此而没有先偷看这一章节。
Flex怎么样呢?我不得不令你失望,因为你没有通向存储于数据库中的数据直接入口。不过,我猜想这其中肯定有些好事,因为你可以继续编写PHP文件来读/写数据库中的数据,甚至在编写Flex应用程序时也是如此。为什么没有从数据库中读取数据的直接方法?因为有句老话说得好:“你应该绝不相信客户端!”
假设客户端是一个知道如何连接MySQL服务器的Flex组件。你如何存储其信任状(credential)才能使得其不容易被盗并且数据库的安全不受损害?为每个用户设置一个不同的用户密码然后向他们发送该信息?这就是为什么使用客户端技术直接连接数据库服务器,而不通过在中间使用应用程序服务器不是一个好主意的原因之一。
通常,在Flex应用程序中,你可以利用服务器侧的脚本来管理数据库。Flex可以为你提供一种调用服务器页面并且在Flex中返回相应的响应的方法。共有3种不同的连接服务器数据源的方式:REST 式样服务、 web 服务和 Remoting (或 RPC)。
你可以利用HTTPService 类来使用 REST 式样服务。当你需要发起一个请求时,你可以发送POST变量,并且其响应可以是XML、JSON (这里有一个用于解析JSON的第三方库)或自定义格式。
如果在服务器(SOAP/WSDL)上具有Web服务,你可以使用WebService类。
但最有趣的方法是remoting (使用 RemoteObject 类)。为什么我认为它是最酷的方法,这里有3个原因:首先,通过使用remoting,你可以通过调用任一public方法在你的服务器上充分利用你拥有的PHP类。通常,在Flex侧,你可以使用RemoteObject 的实例,好像其就是远端PHP类。其次,你可以将数据模型从PHP侧映射到ActionScript 数据模型,并且使得其自动完成转换。这是极为重要的,因为当你使用具有类型的对象时,你能够获得编译时间错误检查和代码完成功能的益处。这意味着代码更易于阅读并且不易出现软件缺陷。第三,该方法的消息格式-AMF3 (Action Message Format) 是二进制格式,该格式与SOAP/XML/JSON相比运行速度更快而且占用空间更小,特别地,对于具有大量数据的应用程序更是如此。该格式本身是开放的,而且所有的开发人员均可以阅读相关的白皮书并且能够实现使用该格式的程序。
AMF3之所以运行速度较快,是因为它能够对数据进行编码。因为,如果在一个数据集合中具有重复的相同字符串,则该字符串只需进行一次编码,而所有其它字符串的出现均为引用。如果一个数字少于4个比特,则只使用要求的最少数量的字节。
Adobe的James Ward 已经创建一种很好的测试方法,该测试方法能够说明remoting和其它方法之间的不同之处。
Flex在本机能够支持Remoting,但在服务器侧情况却是不同的。PHP不能在本机支持remoting 和AMF3。这是为什么你需要一个服务器侧库来支持PHP Web服务器的remoting 功能。共有4个可用的库,并且全部能够免费使用。我已经编写了关于如何使用这些库的指南:Zend AMF, PHPAMF, WebORB for PHP, SabreAMF。点击这里,你可以阅读一篇对它们进行比较的文章。
因为本机数据类型能够自动转换(PHP类型至AS3类型的转换以及相反方向的转换),因此你必须关注来自一种语言的本机类型是如何转换为其它类型的。这里 是一个AMFPHP 库中的数据类型一致性的范例。
在Flex和PHP项目中用户授权是如何进行的呢?答案非常简单,与PHP Web站点相同,你可以使用会话和某种方法来验证用户密码即可。
通常,当在Flex中执行一个调用时,会话ID将会被自动挂起。因此,如果之前已经对用户进行授权,则将使用相同的会话。
点击这里,你将会获得关于该话题的更多信息。
令人欣慰的是,PHP和Flex均为成熟技术,因此当需要使用工具时,你可以具有大量的选择。我将在本章节中讨论其中一些工具。
你可能考虑的第一个选择是使用免费的开源Flex SDK,特别地,如果你非常喜欢命令行工具和文本编辑器(例如vi)。你可以使用你喜欢的文本编辑器编写代码,以及使用命令行工具来编译/调试应用程序。
Flex Builder / Flash Builder 和 Eclipse PDT / Zend Studio
我喜欢使用一种现代IDE。对于Flex 和 PHP 项目来说,最佳的组合可能是Flex Builder 或Flash Builder 4 与Zend Studio之间的组合。Flex Builder 是 Adobe的 Flex IDE直到第四版 的名称;第四版被重新命名为Flash Builder 4。该IDE基于Eclipse,它支持Windows 和Mac OS,并且它是以插件版本和独立版本的方式出现。例如,你具有Zend Studio,你可能考虑使用 Flash Builder 插件,然后在Zend Studio之上安装该插件。 你可以使用 Flex Builder 3 60 天 (试用版本),并且现在(2009年夏)的 Flash Builder 4 为 beta 版本。如果你是教师或学生,则可以免费获得一个许可。
如果你喜欢使用Eclipse PDT,则可以使用相同的方法:安装Flash Builder 4 的插件版本,或从相反方向,在Flash Builder 独立版本之上安装PDT。
Flash Builder 4能够提供使用PHP 和Flex的向导:它能够内视PHP代码并且产生AS3和Flex代码(这里 是关于该话题的指南)。你可以使用它调试、配置、编译以及启动应用程序(Web 或 AIR)。你也可以导出应用程序以便进行发布,另外,Flash Builder 4 还支持重构,以及一个Design 视图和一个状态编辑器。
Flash Builder 4 还能够与Flash Catalyst进行集成,这样,你可以在Flash Catalyst中创建应用程序的UI,然后在Flash Builder 4 中打开创建的项目并且继续添加业务逻辑(你可以点击屏幕截取来看一看如何使用 Adobe Illustrator、Flash Catalyst和 Flash Builder 4创建垂直滚动条)。
Flex支持的其它IDE (商用产品) 包括 IntelliJ IDEA 和FDT (基于Eclipse )。
你可以使用Flex SDK的调试器或Flash Builder 4 (或 Flex Builder 3)的调试器来调试Flex代码。如果你选择 Flash Builder 4 和Zend Studio的组合配置,则你可以非常方便地在相同的项目中调试PHP 和Flex 代码。你可以在执行一个从Flex至PHP的调用之后进入PHP调试器,然后当Flex收到响应时,你就可以进入Flex调试器。点击这里1 和 这里2 可以看到关于该话题的一些视频,点击 这里3 可以下载关于Zend Studio 和Flex Builder 调试的指南。
在PHP中,当我遇到软件缺陷时,我首先采用的方法是使用die() 和var_dump()的调用组合来查看究竟发生了什么问题。在AS3中,你可以使用 trace() 向显示终端输出变量值。一个很酷的功能是当你编译用于生产的应用程序时,所有的trace() 语句均被删除。这是一个无阻塞输出消息的方式。你也可以使用Alert 类在弹出视窗中显示消息 (更像 在进行FireBug之前的JavaScript 调试 )。
你需要时刻牢记的关键之处是:现在你已经具有了独立于服务器的客户端,并且问题可能存在于客户端、服务器或网络层面。
你可以点击这里阅读关于调试Flex 和PHP的更多内容。
.
Adobe AIR 是 RIA的一个桌面运行时,而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引擎。这两个引擎提供了一个API集合,该API集合提供了访问AIR应用程序运行的设备的通路。这些API可以用于读写磁盘文件、检测网络连接性、检测连接显示器的数量和分辨率、应用程序更新、桌面通知、本地数据库以及拖拽等等。
作为一个Web开发人员,你可以选择下列技术的任意组合:Flex、ActionScript 3或 HTML/CSS/JavaScript。你可以只使用HTML、JavaScript和 CSS即可创建AIR应用程序。实际上,Dojo Toolbox 和 Yahoo!的Sideline 就是使用HTML/CSS/JS创建的。
因此利用AIR,你可以充分利用你的现有技术来创建桌面应用程序。但是,为什么你希望创建作为桌面应用程序运行的Web应用程序呢?实际上,这里存在的原因很多:
· 在你没有因特网连接的情形下,你希望能够使用应用程序或部分应用程序。
· 你希望摆脱browser chrome的控制,并且完全自定义应用程序的外观。
· 你希望能够在用户的计算机中将应用程序与其它应用程序集成(例如,将文件从AIR app拖拽至桌面,反之亦然)。
· 你希望能够在用户的设备上存储文件。
· 你希望建立一个通知系统,并且希望在系统盘中以最小化的方式运行应用程序(例如,及时消息服务可以在收到一个新的消息时通知你,尽管它们处于最小化状态并且不在注视范围之内)。
对于开发AIR应用程序来说,你可以使用免费的AIR SDK (你可以获得用于创建、测试和调试的命令行工具),你可以使用 Aptana Studio (如果你希望使用 HTML/JS/CSS创建AIR应用程序),以及使用 Flash Builder 4 (或 Flex Builder 3)。
最后需要说明的是,为浏览器创建的任何Flex应用程序可以立即转换为AIR应用程序。当然,如果你停止在这里并且不希望充分利用特定的AIR功能,则上述转换毫无意义,因为你没有提供任何附加的价值。
明年初Flex 4将会面世。Adobe 已经开发了一个名称为 Flash Catalyst 的新工具(目前仍处于beta版状态),该工具可以用于将在Photoshop 或Illustrator 中创建的静态设计转换Flex的功能用户界面。设想一个工具可以用于输入Photoshop 或Illustrator文件、输出HTML/CSS/JavaScript代码以及保持输入文件的外观。这就是Flash Catalyst目前能够完成的任务,只不过它输出的是Flex 4代码而不是HTML代码。
同时,我们致力于使得Flash Platform 能够运行于所有的屏幕:从计算机到移动设备,以及从机顶盒(set-top box)到电视机。目前,Flash Lite 3 可以用于各种手机(诺基亚、索尼爱立信、HTC、Android和Palm)。明年,我们将推出支持手机的Flash Player 10版本。另外,明年很可能我们可以看到支持Flash的电视机。如果用户界面能够充分利用所有的Flash Player 功能,或者能够从Web观看高清视频(Flash 能够支持 H-264 标准),那将是多么有趣的事情。一些分析专家认为在不久的将来,连接因特网的手机数量将超过计算机数量,并且大多数人在身边没有计算机时将会使用手机作为访问因特网的主要手段。
对于Web开发人员来说这意味着什么?这意味着你可以扩展你的专业技术领域和你从Web站点提供给桌面RIA(使用Adobe AIR),以及从计算机提供给手机和其它具有屏幕的设备的功能。当然,为了实现上述目标,你需要提升你在某些方面的技能,但对于给定的平台,其复杂程度还不及成为一个高效C或C++ 开发人员所需的技能。
我希望你已经找到了一些回答你的问题的答案。如果你对进入Flex世界是认真的,下面是一些资源:
Flex之旅
我将Tour de Flex 视为可爱的php_manual.chm的Web 2.0 或RIA版本。你可以从这里安装Tour de Flex。Tour de Flex提供了如何在Flex中使用组件的范例(你可以看到组件外观以及用于实现组件的代码)。你也可以方便地访问相应的Flex文档。该应用程序本身是使用Flex 和Adobe AIR创建的。
书籍
目前关于Flex 和ActionScript 3的书籍很多。但是,我个人喜爱并且我经常推荐的书籍如下所列:
· Flex入门(First steps in Flex),作者是 Bruce Eckel 和James Ward(Adobe的技术作者);该书给出了如何使用Flex开发Web和桌面应用程序的概述,并且你可以在一个周末读完全书。
· ActionScript 3精华读本(Essential ActionScript 3) ,作者是Colin Moock;这是一本厚书,如果你能够在一个周末读完全书,那么你将是一个卓越的阅读家。尽管本书没有涵盖Flex内容,但你可以学到几乎所有关于ActionScript 3的知识。
Web站点
目前,涉及Flex 和ActionScript 3的Web站点和博客数以百计。因此,不可能为你提供完整的站点列表,但我将给出我所喜爱的站点:
· Adobe 开发人员中心(Adobe Developer Connection)。一个阅读Flash、Flex和 AIR技术文章的极佳去处。该Web站点每周定期更新。 其中有个 章节 专门讨论 Flex和 PHP。
· Adobe 电视(Adobe TV)。该站点为你提供会议演讲的巨量视频信息以及视频资料。
· Gotoandlearn.com。 一个优秀的视频资料集,由会员作者Lee Brimelow编写。
· Flex 文档(Flex documentation)。记住你可以下载该文档的ZIP文件。你可以点击这里 以便查看多种格式的资源。
· Adobe 社区组(Adobe Groups)。一个免费平台,在此你可以寻找Adobe用户组(包含Flex 或Flash 组)。浏览一下该平台,也许可以发现与你的领域相关的Flex 用户组,并且他们通常每个月组织一次会议。该平台拥有多个论坛,并且支持本地化,因此,平台内容不仅限于使用英语。
· 我的博客链接(My blogroll)。查看一下该博客链接,其中大部分博客主人是来自Adobe的,他们撰写与Flash 和 Flex相关的博文。
· 请访问我自己维护的关于框架、库和其它Flex相关资源的列表。
现在,我认为,你可以理解为什么当一个开发人员问我什么是Flex时,我会面无表情地凝视片刻。在这片刻时间,所有我在这里撰写的千言万语浮现在我的眼前…我想讨论的东西很多,无法简单地用只言片语来表达呢!希望现在我能够这样回答你:“老兄,Flex是令人敬畏的!看看本文吧”。
如果你有任何评论,请抽出宝贵时间在本页留下,本人不胜感激!
【国内下载】Flex 3 Builder :http://g.csdn.net/5120749
【国内下载】Adobe Flash Builder 4 :http://g.csdn.net/5105812
【官方下载】Flex 3 Builder :http://g.csdn.net/5121278
【官方下载】Adobe Flash Builder 4 :http://g.csdn.net/5120750