2024 年日本 PHP 研討會

SoapClient::__call

(PHP 5, PHP 7, PHP 8)

SoapClient::__call呼叫 SOAP 函式(已棄用)

說明

public SoapClient::__call(字串 $name, 陣列 $args): 混合

直接呼叫此方法已被棄用。通常,SOAP 函式可以作為 SoapClient 物件的方法來呼叫;在無法這樣做或需要額外選項的情況下,請使用 SoapClient::__soapCall()

參數

name

要呼叫的 SOAP 函式名稱。

args

要傳遞給函式的引數陣列。這可以是有序陣列或關聯陣列。請注意,大多數 SOAP 伺服器都需要提供參數名稱,在這種情況下,這必須是關聯陣列。

傳回值

SOAP 函式可能會傳回一個或多個值。如果 SOAP 函式只傳回一個值,則傳回值將是一個純量值。如果傳回多個值,則會傳回一個已命名輸出參數的關聯陣列。

發生錯誤時,如果 SoapClient 物件是在 exceptions 選項設定為 false 的情況下建構的,則會傳回 SoapFault 物件。

新增註釋

使用者貢獻的註釋 2 則註釋

philipp dot gruber at catchoftheday dot com dot au
10 年前
如果您使用 WSDL,程式庫會從您的參數中移除任何未在 WSDL 中定義的內容,而不會通知您。

因此,如果您的參數與 WSDL 不完全相符,它將不會傳送任何參數。
如果您無法存取目標伺服器,這可能會有點難以除錯。

__soapCall() 預期參數位於名為 'parameters' 的陣列中,而不是透過其 WSDL 名稱呼叫函式,在 WSDL 名稱呼叫中,它接受參數作為一般陣列。

例如,如果名為 sendOrder 的函式預期一個名為 orderDetails 的參數(陣列),您可以像這樣呼叫它

$orderDetails = array(/* 您的資料 */);
$soap->sendOrder(array('orderDetails' => $orderDetails));

這等同於

$client->__soapCall('sendOrder', array('parameters' => array('orderDetails' => $orderDetails)));

請注意 __soapCall() 中使用的額外 'parameters' 鍵值。
KRavEN
15 年前
__call 的延伸,它增加了重試機制來處理偶爾發生的「無法連線到主機」例外狀況。

<?php
class LocalSoapClient extends SoapClient
{

public function
__call($function_name, $arguments)
{
$result = false;
$max_retries = 5;
$retry_count = 0;

while(!
$result && $retry_count < $max_retries)
{
try
{
$result = parent::__call($function_name, $arguments);
}
catch(
SoapFault $fault)
{
if(
$fault->faultstring != 'Could not connect to host')
{
throw
$fault;
}
}
sleep(1);
$retry_count ++;
}
if(
$retry_count == $max_retries)
{
throw new
SoapFault('Could not connect to host after 5 attempts');
}
return
$result;
}
}
?>
To Top