工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 2502|回复: 1

在AMFPHP中使用自定义类

[复制链接]
发表于 2008-6-10 22:44 | 显示全部楼层 |阅读模式
原文同时发布于http://hi.baidu.com/gdutpxz/blog ... f9773a8694732f.html



flex cookbook上的amfphp例子中,可以看到作者并没有使用到Employee.php和Employee.as 这两个文件
这里给出一个使用这两个文件的例子。
由于没有安装Oracle ,数据库使用的是MySql。

使用自定义类(custom class) 时最重要的只有两点
          1.php版本的类里的$_explicitType 变量
          2.as版里的 [RemoteClass] 元
一般情况下这些都是ValueObject,据flexbuilder带来的说明,序列化时仅对两者的属性进行,当然,反序列化也只能结属性执行了。
下面是一个不依赖 -services xxx.xml 编译参数的例子:


===========================================================
客户端源代码开始
===========================================================
========================================================
源文件 main.mxml  如果你的amfphp是放在其它目录,改掉红色部分。
========================================================
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    creationComplete="init()" layout="absolute">
<!--
    这个RemoteObject调用EmployeeService。它包含有:destination, source以及事件处理。(译注:destination与service-config.xml的destination对应,而source则与具体服务名称相关)
-->
<mx:RemoteObject endpoint="http://localhost/amfphp/gateway.php" id="myservice" source="Project.EmployeeService" destination="amfphp" fault="faultHandler(event)" showBusyCursor="true">
    <mx:method name="getEmployees" result="resultHandler(event)"
fault="faultHandler(event)">
    </mx:method>
</mx:RemoteObject>
<mx:Script>
    <![CDATA[
        import project.Employee;
        import mx.utils.ArrayUtil;
        import mx.collections.ArrayCollection;
        import mx.rpc.events.FaultEvent;
        import mx.rpc.events.ResultEvent;
        import mx.controls.Alert;

        //当数据返回里dp:ArrayCollection被设为服务端返回的ResultEvent的result属性的内容。
        [Bindable]
        private var dp:ArrayCollection;
      
        public function init():void{
        }
        private function faultHandler(event:FaultEvent):void {
            Alert.show(event.fault.faultString, event.fault.faultCode.toString());
        }
        private function resultHandler(event:ResultEvent):void {
            dp=new ArrayCollection(ArrayUtil.toArray(event.result));
            try{
                var temp:Employee = dp[1] as Employee;
                Alert.show("Emaile="+temp.EMAIL);
            }catch(e:Error){
                try{
                    var temp2:Employee=event.result as Employee;
                    Alert.show("temp2 Emaile="+temp2.EMAIL);
                }catch(ee:Error){
                    Alert.show("What cow second..");
                }
            }
        }
    ]]>
</mx:Script>
    <mx:Canvas x="0" y="0" width="100%" height="100%">
        <mx:Button x="10" y="10" label="Get data"
click="myservice.getOperation('getEmployees').send()"/>
                                         
<!--
每一列都与服务端返回相关联
-->
        <mx:DataGrid x="10" y="40" width="100%" height="100%"  dataProvider="{dp}">
            <mx:columns>
                <mx:DataGridColumn headerText="EMPLOYEE_ID" dataField="EMPLOYEE_ID"/>
                <mx:DataGridColumn headerText="FIRST_NAME" dataField="FIRST_NAME"/>
                <mx:DataGridColumn headerText="LAST_NAME" dataField="LAST_NAME"/>
                <mx:DataGridColumn headerText="EMAIL" dataField="EMAIL"/>
                <mx:DataGridColumn headerText="PHONE_NUMBER"
dataField="PHONE_NUMBER"/>
                <mx:DataGridColumn headerText="HIRE_DATE" dataField="HIRE_DATE"/>
                <mx:DataGridColumn headerText="JOB_ID" dataField="JOB_ID"/>
                <mx:DataGridColumn headerText="SALARY" dataField="SALARY"/>
                <mx:DataGridColumn headerText="COMMISSION_PCT"
dataField="COMMISSION_PCT"/>
                <mx:DataGridColumn headerText="MANAGER_ID" dataField="MANAGER_ID"/>
                <mx:DataGridColumn headerText="DEPARTMENT_ID"
dataField="DEPARTMENT_ID"/>
            </mx:columns>
        </mx:DataGrid>
    </mx:Canvas>
</mx:Application>

==========================================================
源文件: project/Employee.as (注意大小写)
==========================================================

  1. package project {
  2.     [RemoteClass(alias="Project.Employee")]
  3.     [Bindable]
  4.     public class Employee
  5.     {
  6.         public var EMPLOYEE_ID:Number;
  7.         public var FIRST_NAME:String;
  8.         public var LAST_NAME:String;
  9.         public var EMAIL:String;
  10.         public var PHONE_NUMBER:Number;
  11.         public var HIRE_DATE:String;
  12.         public var JOB_ID:Number;
  13.         public var SALARY:Number;
  14.         public var COMMISSION_PCT:Number;
  15.         public var MANAGER_ID:Number;
  16.         public var DEPARTMENT_ID:Number;
  17.         //public function Employee(){}
  18.     }
  19. }
复制代码
===========================================================
客户端源代码结束
===========================================================
服务端源代码开始
===========================================================

===========================================================
PHP源文件 services_path/EmployeeService.php
===========================================================

  1. <?php require_once('./Employee.php');
  2. class EmployeeService {
  3.     function getEmployees(){
  4.         $myconnection = mysql_connect("localhost","hr","hr");
  5.         mysql_select_db("fcb_Employee");
  6.         # 检查MySql链接
  7.         if (!myconnection) {
  8.             # 链接失败,不简单地使用die而是返回一些有用的数据给客户端。
  9.             trigger_error("AMFPHP Remoting 'EmployeeService'
  10. class could not connect: " . mysql_error());
  11.         }
  12.         $query="SELECT * FROM employee";
  13.         # 返回雇员列表
  14.         $result=mysql_query($query);
  15.         if (!$result) {
  16.             trigger_error("AMFPHP Remoting 'EmployeeService'
  17. class database SELECT query error: " . mysql_error());
  18.         }
  19.         while ($row = mysql_fetch_assoc($result)) {
  20.             $tmp=new Employee($row);
  21.             $data_array[] = $tmp;
  22.         }
  23.         return $data_array;
  24.     }
  25. }
  26. ?>
复制代码
===========================================================
PHP源文件 services_path/Project/Employee.php (注意大小写)
===========================================================

  1. <?php class Employee
  2. {
  3.     var $EMPLOYEE_ID=1;
  4.     var $FIRST_NAME="a";
  5.     var $LAST_NAME="b";
  6.     var $EMAIL="[email protected]";
  7.     var $PHONE_NUMBER=3;
  8.     var $HIRE_DATE="2009";
  9.     var $JOB_ID=3;
  10.     var $SALARY=9999;
  11.     var $COMMISSION_PCT=43;
  12.     var $MANAGER_ID=4;
  13.     var $DEPARTMENT_ID=6;
  14.     var $_explicitType = "Project.Employee";
  15.     function Employee($r){
  16.         $this->init($r);
  17.     }
  18.     function init($r){
  19.         $keys=array_keys($r);
  20.         foreach($keys as $k){
  21.             $this->$k=$r[$k];
  22.         }
  23.     }
  24. }
  25. ?>
复制代码
=======================     数据库部分         ===========================
================== 请以有创建用户权限的帐号导入========================

  1. create database fcb_Employee;
  2. use fcb_Employee;
  3. --
  4. -- 表的结构 `employee`
  5. --
  6. CREATE TABLE IF NOT EXISTS `employee` (
  7.   `EMPLOYEE_ID` int(10) unsigned NOT NULL auto_increment,
  8.   `FIRST_NAME` varchar(20) NOT NULL,
  9.   `LAST_NAME` varchar(20) NOT NULL,
  10.   `EMAIL` varchar(50) NOT NULL,
  11.   `PHONE_NUMBER` varchar(20) NOT NULL,
  12.   `HIRE_DATE` date NOT NULL,
  13.   `JOB_ID` int(10) NOT NULL,
  14.   `SALARY` int(10) NOT NULL,
  15.   `COMMISSION_PCT` int(10) NOT NULL,
  16.   `MANAGER_ID` int(10) NOT NULL,
  17.   `DEPARTMENT_ID` int(10) NOT NULL,
  18.   PRIMARY KEY  (`EMPLOYEE_ID`)
  19. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

  20. GRANT ALL PRIVILEGES ON fcb_Employee.* TO hr@localhost  IDENTIFIED BY 'hr' WITH GRANT OPTION;
  21. -- 插入数据,为了省事,这两段数据是ctrl+c ctrl+v得到的...仅有ID不同..
  22. INSERT INTO `fcb_Employee`.`employee` (
  23. `EMPLOYEE_ID` ,
  24. `FIRST_NAME` ,
  25. `LAST_NAME` ,
  26. `EMAIL` ,
  27. `PHONE_NUMBER` ,
  28. `HIRE_DATE` ,
  29. `JOB_ID` ,
  30. `SALARY` ,
  31. `COMMISSION_PCT` ,
  32. `MANAGER_ID` ,
  33. `DEPARTMENT_ID`
  34. )
  35. VALUES (
  36. NULL , 'Pan', 'iptton', 'iptton#gmail.com', '999999999', '2008-06-10', '1', '999999', '999', '9', '9'
  37. );

  38. INSERT INTO `fcb_Employee`.`employee` (
  39. `EMPLOYEE_ID` ,
  40. `FIRST_NAME` ,
  41. `LAST_NAME` ,
  42. `EMAIL` ,
  43. `PHONE_NUMBER` ,
  44. `HIRE_DATE` ,
  45. `JOB_ID` ,
  46. `SALARY` ,
  47. `COMMISSION_PCT` ,
  48. `MANAGER_ID` ,
  49. `DEPARTMENT_ID`
  50. )
  51. VALUES (
  52. NULL , 'Pan', 'iptton', 'iptton#gmail.com', '999999999', '2008-06-10', '1', '999999', '999', '9', '9'
  53. );
复制代码

[ 本帖最后由 onttpi 于 2008-6-10 22:48 编辑 ]

评分

3

查看全部评分

发表于 2008-6-11 14:08 | 显示全部楼层
支持一下,没学过PHP
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-8-30 07:05

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表