今天來研究一下另一種 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 裡面設的別名是否相同?
需要的檔案是否正確匯入?...等
沒有留言:
張貼留言