变量作用域
前面我们已经了解了变量、函数和类是如何在 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.youkuaiyun.com/5120749
【国内下载】Adobe Flash Builder 4 :http://g.youkuaiyun.com/5105812
【官方下载】Flex 3 Builder :http://g.youkuaiyun.com/5121278
【官方下载】Adobe Flash Builder 4 :http://g.youkuaiyun.com/5120750