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 对象。

添加注释

用户贡献的注释 4 个注释

philipp dot gruber at catchoftheday dot com dot au
10 年前
如果您使用的是 WSDL,库将从您的参数中删除 WSDL 中未定义的任何内容,而不会通知您。

因此,如果您的参数与 WSDL 不完全匹配,它将根本不发送任何参数。
如果您无法访问目标服务器,这可能很难调试。

__soapCall() 期待参数位于名为“parameters”的数组中,而不是通过其 WSDL 名称调用函数,在这种情况下它接受参数作为普通数组。

例如,如果名为 sendOrder 的函数期待一个名为 orderDetails 的参数(数组),您可以这样调用它

$orderDetails = array(/* your data */);
$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;
}
}
?>
bananos at dev dot co dot ua
16 年前
我正在编写 PHP SOAP 客户端(基于 php_soap 扩展),它使用 Google AdService。
今天,我尝试使用 AdService::addAds() 创建示例广告,并发现我的 SOAP 库没有在 SOAP 请求中传递
"headline"、"description1"、"description2" 参数。

首先,我认为我的数据有问题,因为我收到诸如
"一个或多个输入元素验证失败" 之类的验证错误。然后我决定查看 WSDL 描述
https://adwords.google.com/api/adwords/v11/AdService?wsdl

然后我就发现了它

<complexType name="Ad" abstract="true">
<sequence>
<element name="adGroupId" type="xsd:int"/>
<element name="adType" nillable="true" minOccurs="0" type="impl:AdType"/>
<element name="destinationUrl" nillable="true" minOccurs="0" type="xsd:string"/>
<element name="disapproved" type="xsd:boolean"/>
<element name="displayUrl" nillable="true" minOccurs="0" type="xsd:string"/>
<element name="exemptionRequest" nillable="true" minOccurs="0" type="xsd:string"/>
<element name="id" type="xsd:long"/>
<element name="status" nillable="true" minOccurs="0" type="impl:AdStatus"/>
</sequence>

</complexType>

没有任何“description”、“headline1”、“headline2”,但有另一个 complexType

<complexType name="TextAd">
<complexContent>
<extension base="impl:Ad">
<sequence>

<element name="description1" nillable="true" type="xsd:string"/>
<element name="description2" nillable="true" type="xsd:string"/>
<element name="headline" nillable="true" type="xsd:string"/>
</sequence>

</extension>
</complexContent>
</complexType>

所以,当您使用 php_soap 时,请注意 complexType 扩展,因为当您尝试执行诸如以下操作时,它们在 php_soap 中不起作用

<?php

$client
= new
SoapClient(
"https://adwords.google.com/api/adwords/v11/AdService?wsdl",
array(
'trace' => true,
'exceptions' => true,
)

);

$entropy = substr(md5(rand(0, time())), 0, 10);
//create Ad test structure
$sample_ad = array(
"id" => 0,
"adGroupId" => 0,
"adType" => 'TextAd',
"disapproved" => false,
"destinationUrl" => 'http://test.com',
"displayUrl" => 'www.Test.com',
"status" => "Paused", // Enabled / Disabled
"descr_iption1" => 'D1_'.$entropy,
"des_cription2" => 'D2_'.$entropy,
"head_line" => 'H_'.$entropy
);

$client->addAds(array('ads' => array($sample_ad) );
?>
Samil Abud
16 年前
您好,
这是一个关于 SOAP 函数 "__call" 的良好示例。
但是它已过时。

<?php
$wsdl
= "http://webservices.tekever.eu/ctt/?wsdl";
$int_zona = 5;
$int_peso = 1001;
$cliente = new SoapClient($wsdl);
print
"<p>Envio Internacional: ";
$vem = $cliente->__call('CustoEMSInternacional',array($int_zona, $int_peso));
print
$vem;
print
"</p>";
?>
To Top