PHP Conference Japan 2024

SoapClient::__call

(PHP 5, PHP 7, PHP 8)

SoapClient::__call调用 SOAP 函数(已弃用)

描述

public SoapClient::__call(string $name, array $args): mixed

直接调用此方法已弃用。通常,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 名称调用函数,在这种情况下,它将参数作为普通数组接受。

例如,如果名为 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