原文:http://www.cnblogs.com/Jaypei/archive/2009/04/09/1432521.html
上一次成功的使用nuSOAP傳遞對象,實際生產過程中常還有另一個需求,就是遠端傳回物件數組。花了一下午的時間終於成功測試成功,於是迫不及待的拿出來跟大家分享:)
準備工作
先定義一個類別UserInfo:
$UserName
; //...
接著寫一個測試用的遠端方法: function hello() {
$a
);
$a
->UserName
=
"
Jaypei
"
;
$a->
;
$b = new UserInfo(); $b
->UserName = $b->Sequence
=
83910021
;
return
array
);}
一個普通的nuSOAP程式如下:(整個過程是對它的改造)
$soap // 使用UTF- 8$soap->
soap_defencoding
=
'
UT >
decode_utf8
=
false
;// 需設定WSDL命名空間,假設jaypei.cnblogs.com
$soap
->
cns5
,
'
urn:jaypei.cnblogs.com');//
'
hello');$soap->service(?);
改造過程
首先,註冊一個UserInfo的複合型,方法如下:(這個之前已寫過)
$soap->wsdl->addComplex類型(
'complex類型',
'struct',
' ,
array( '
UserName
'=>array(
'
name
'=>name'=>name' 'type '=>'xsd:string'), =>
array
(
'
name
'
=>
'
Sequence', ', ' xsd:int') ) );
這樣就可以透過以下方式回傳一個單一的UserInfo物件:(hello中回傳$a或回傳$b)
$soap->register('hello', array(), array(),
array('return'=>'tns:UserInfo'));
如果要返回一個列表,則需要改動return處的類型。起初找到了返回string或int等基礎類型的列表方法,如下:
$soap->register('hello', array(),
array('return'=>'SOAP-ENC:Array') ) ;
當這個方法用到自訂複合類型上時類型處會變成:xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="object[2]
"object並不是object[2]
"
object並不是我們想要的。於是上網找相關資料發現瞭如下方法:
$soap->register('hello', array(), array('return'=>'tns:UserInfoArray') );
這裡要自訂新增一個tns:UserInfoArray的陣列類型,方法如下:
$soap
->wsdl
$soap
->
UserInfoArray
',
'complex類型
'
,
''
, '
SOAP-ENC :Array
'
, array
()
array('ref'=>
'
SOAP-ENC:arrayType
'
,'wsdl:arrayType' ) )
, '
tns:UserInfo
');3 PHP錯誤:
Catchable fatal error: Object of class UserInfocould not be converted to string in ...nusoapnusoap.php on line 6002
於是找到如何轉換完. ("serializing array element: $k, $v of type: $typeDef[arrayType]");
代碼沒有多看,不過很明顯只是個debug的代碼,沒什麼實際作用。於是直接註解掉繼續調用,OK!通過了,一切順利。 註:這個錯誤現在還不知是因為我的使用方法有違了設計本意還是nuSOAP本身的bug,反覆列舉了一些應用都沒有什麼問題後就算是成功了,如果有什麼錯誤還請大家指正。
以上就介紹了nusoap傳遞物件數組,包含了方面的內容,希望對PHP教程有興趣的朋友有所幫助。