[转]关于flex和flash两种平台上面使用AMFPHP进行类映射的问题

AMFPHP是PHP的远程调用(RPC, Remote Procedure Call)工具。它可以使PHP与下述技术无缝通信:
  (1) Flash 和 Flex Remoting
  (2) JavaScript JSON 和 Ajax JSON
  (3) XML 和XML-RPC

AMFPHP的工作原理
  客户端(Flash / Flex)与服务器端(PHP) 使用相同的方式描述方法调用和复杂数据。客户端序列化请求并将它发送到网关AMFPHP。AMFPHP再执行:
  (1) 反序列化请求
  (2) 找到相应的远程服务类
  (3) 实例化类
  (4) 执行安全检查
  (5)(使用指定参数)调用服务器端方法
  (6) 序列化返回的数据
  AMFPHP可以正确地序列化、反序列化复杂类型数据。除了对象和数组,它还支持 resources 数据连接资源,这就意味着我们可以通过调用远程方法简单返回mysql_query,amfphp 会处理这一切。如果平台支持 (目前来说,Flash Remoting 和Flex Remoting),AMFPHP还可以处理循环引用和自定义数据它也支持简单的远程调试。还有AMFPHP附带一个浏览器,它可以在创建客户端代码前测试远程服务。AMFPHP 1.0.1还添加了模板,可以自动生成客户端代码。AMFPHP 1.9 beta更是新增了对AMF3的支持。

以上就是官方解释。
用很明白的话就是客户端发送的数据可以是一个对象,然后经过网络层之后到了服务器端,接受的数据也是个对象,而网络层只能够发送0101 这样的数据也就是说用一种东西将这些二进制的数据给转换成了我们想要的对象。
这个东西就是AMFPHP。
他封装了一些方法,将客户端的AS类和服务器端的数据结构互相映射。
在flex和flash平台上的使用方式是不一样的,要区分开问题才好解决。
首先说在flex平台上:
     RemoteObject和server_config.xml分工合作,访问服务器方法。
     RemoteObject的属性如下:
     id=”ro”;
     fault:发生错误事件的处理。
     showBusyCursor  :显示鼠标busy状态。
     source :服务器端service下面的php文件。
     destination 在server_config.xm文件中设置的destination。
<mx:method name=”getPerson” result=”getPerson_Result(event)” />
<mx:method name=”savePerson” result=”savePerson_Result(event)” />
name指的是source这个类中的方法名称,result指的是方法调用后成功的时候返回的事件。
      调用的方式:
         ro.getPerson();
         ro.savePerson(new person(XXX));
需要注意的地方是,Person是AS3的数据结构,他要和服务器的一个类对应。
在类中使用元标签即可[RemoteClass(alias="远程服务器的类路径")],这个类路径要和as3的person类路径保持一致,连类名也要一样,不然flex不认。在getPerson_Result(event:ResultEvent)的处理中,result就可以直接as Person来使用。

在flash平台上面
     在这上面是不能够使用元标签的RemoteClass的,所以需要使用别的方式,我使用的是registerClassAlias
为类注册一个别名,这个别名必须是Person的类全路径。

public class Person{

    public var name:String
    public var age:int
    public var address:String
    public var _explicitType:String;
        /*
        * Contructor
        */
        public function Person(name:String="", age:int=0, address:String=""){
            this.name = name;
            this.age = age;
            this.address = address;
        }
        static public function register():void
        {
            registerClassAlias("com.flashdb.Person", Person) ;  
        }     但是这样做,flash的Person还是会报错,因为在php的Person.php中有一个必须要有的属性$_explicitType
这个属性是告诉amfphp,这个php要映射成那个as类。在flex中我猜想应该被flex给屏蔽了所以没有输出。但是在flash中他居然也被序列化回来了。所以as3的Person也必须要有这个属性。像我上面那个Person样子就可以,这个时候服务器端发回来的二进制数据被序列化成Person对象,这个时候你会发现,直接使用Person作为返回的参数没有问题。
如下:

var responder = new Responder(getPerson_Result, onFault);
netConnect.call("TestPerson.getPerson", responder);
//这个时候p就是序列化回来的对象了。
function getPerson_Result(p:Person) {
        //trace(p.name,p.age,p.address,p._explicitType)
        trace(p is Person)
        name_txt.text = p.name
        age_txt.text = p.age
        address_txt.text = p.address
        status_txt.text = ""
    }

你可能感兴趣的:(数据结构,PHP,json,Flex,Flash)