今天來研究一下另一種 Typed Object 的方式,把 PHP 類別 mapping 到 ActionScript 裡面(這種專門用來存放資料的物件稱為 Value Object)
首先回顧一下我們的 gateway,透過 addDirectory 我們把 AMFapp/ 下的 .php 動態載入
<?php require_once 'Zend/Amf/Server.php'; $server = new Zend_Amf_Server(); $server->addDirectory(dirname(__FILE__) . '/AMFapp/'); $response = $server->handle(); echo $response; ?>
接下來我們在 AMFapp 下面新開一個資料夾 vo,專門用來放 Value Object 的類別
並在裡面建立一個 VOPerson.php
<?php class VOPerson{ //注意這裡!! 用 public $_explicitType 設定類別別名 public $_explicitType = "VOPersonAlias"; public $fName = "Joseph 喬瑟夫"; public $lName = "Joestar 喬斯達"; public $favoriteFood = array("T-Bone Steak", "Fried Chicken", "Chewing Gum"); protected $standName = "Hermit Purple"; private $birthday = "1920-09-27"; } ?>
除了用 public $_explicitType 設定類別別名外,也可以用 getASClassName 回傳類別別名
兩種方式擇一即可
public function getASClassName(){ return 'VOPersonAlias'; }
有了 mapping 的 PHP 類別後,我們再寫一個 TestVO.php (放在 AMFapp下) 用來回傳這個 VOPerson 類別
<?php //記得要把類別匯入 include 'vo/VOPerson.php'; class TestVO{ public function getVOPerson(){ return new VOPerson(); } } ?>
在 Flash 裡面我們也要準備一個跟 VOPerson 對應的類別,本例為 VOPerson.as
範例方便起見就使用 default package
package { public class VOPerson { public var fName:String; public var lName:String; public var country:String; public var favoriteFood:Array; //非 public 的物件成員是不會 mapping 過來的,這邊只是測試用而已 protected var standName:String; private var birthday:String; //這邊我們定義 toString 方法以便傾印資料 public function toString():String{ var s:String = "======== " + fName +" ‧ "+ lName +" ========\n"; s += "國籍: "+ country +"\n"; s += "喜歡的食物: "+ favoriteFood +"\n"; s += "替身名: "+ standName +"\n"; s += "生日: "+ birthday +"\n"; s += "================================================="; return s; } } }
該準備的東西都齊了,組合!!
ValueObjectTest1.fla
import flash.net.*; //注意這裡!! 一定要註冊類別別名且與 $_explicitType 的值相同,這樣才可以正確識別 registerClassAlias("VOPersonAlias", VOPerson); [Bindable] var person:VOPerson; var nc:NetConnection = new NetConnection(); var responder:Responder = new Responder(onNCResult, onNCFault); nc.connect("http://localhost/zend_gateway.php"); nc.call("TestVO.getVOPerson", responder); function onNCResult(re:*):void{ person = VOPerson(re); trace(person); //因為我們寫了 toString(),所以可以直接 trace } function onNCFault(fault:Object):void{ for(var s:String in fault){ trace(s); } }
如果順利的話就可以見到如下資訊
可以看到非 public 的屬性是過不來的
======== Joseph 喬瑟夫 ‧ Joestar 喬斯達 ======== 國籍: U.S.A. 喜歡的食物: T-Bone Steak,Fried Chicken,Chewing Gum 替身名: null 生日: null =================================================
如果出現錯誤訊息的話,請檢察類別別名是否有設定?
在 PHP 跟 AS 裡面設的別名是否相同?
需要的檔案是否正確匯入?...等
沒有留言:
張貼留言