SoapVar和SoapParam有什么区别?

时间:2017-03-15 00:10:27

标签: php soap soap-client

在PHP中,我们有SoapVarSoapParam个类。我已经困惑了很长时间,因为在php.net上没有关于它们的正确文档。

今天我很惊讶地发现这些行会在XML输入中产生完全相同的结果:

$soapVar   = new SoapVar((object) ['Foo' => 'bar'], null, null, null, 'TagName');
$soapParam = new SoapParam((object) ['Foo' => 'bar'], 'TagName');

在大多数SoapClient教程中,只要有人想要设置自定义SoapParam,我就会在SoapVar内看到xsi:type的代码段:

$response = $soapClient->DoSomething(
    new SoapParam(
        new SoapVar(
            (object) ['Foo' => 'bar'],
            null,
            'TypeName'
        ),
        'TagName'
    )
);

这真的不直观,因为SoapVarSoapParam班级名称并不多见。更优雅的结果可以达到同样的效果:

$response = $soapClient->DoSomething(
    new SoapVar(
        (object) ['Foo' => 'bar'],
        null,
        'TypeName',
        null,
        'TagName'
    )
);

那么SoapParam的目的是什么?它只是SoapVar的更简单版本吗?看起来这两个人很困惑并被误解了很多。是否有任何附加行为附加到SoapParam

1 个答案:

答案 0 :(得分:3)

你是对的,手册有点模糊,解释了理论上的确切差异,我很惊讶到目前为止没有人指出一些详细的信息或解释他们的差异。

通过手册

SoapParam:

  

表示SOAP调用的参数。

SoapVal:

  

表示用于SOAP服务的变量或对象的类。

我走了一点,我能找到的主要区别是代表性构造函数中的data参数:

SoapParam::SoapParam ( mixed $data , string $name ) 其中$data =

  

要传递或返回的数据。此参数可以直接传递为   PHP值,但在这种情况下,它将被命名为paramN和SOAP   服务可能不理解。

另一方面,我们有SoapVar::SoapVar ( mixed $data , string $encoding [, string $type_name [, string $type_namespace [, string $node_name [, string $node_namespace ]]]] ) $data =

  

要传递或返回的数据。

通过考虑这两个例子,PHP手册中的例子,我相信参数传递的主要区别以及你可以用另一个不能用另一个做的事情。

对于SoapParam

<?php
$client = new SoapClient(null,array('location' => "http://localhost/soap.php",
                                    'uri'      => "http://test-uri/"));
$client->SomeFunction(new SoapParam($a, "a"),
                      new SoapParam($b, "b"),
                      new SoapParam($c, "c"));
?>

其中$a$b$c是PHP变量直接发送而不通过结构/类传递它们。 SaopParam构造函数获取参数$data(PHP变量)和参数名称的String表示。

另一方面SoapVar

<?php
class SOAPStruct {
    function SOAPStruct($s, $i, $f) 
    {
        $this->varString = $s;
        $this->varInt = $i;
        $this->varFloat = $f;
    }
}
$client = new SoapClient(null, array('location' => "http://localhost/soap.php",
                                     'uri'      => "http://test-uri/"));
$struct = new SOAPStruct('arg', 34, 325.325);
$soapstruct = new SoapVar($struct, SOAP_ENC_OBJECT, "SOAPStruct", "http://soapinterop.org/xsd");
$client->echoStruct(new SoapParam($soapstruct, "inputStruct"));
?>

正如您所看到的,参数/变量通过每个定义的类传递,并在该类的对象作为参数传递之后传递。该类是SOAP结构的代表(SOAP可以识别/使用SoapParam的风险)。

现在几乎令人困惑的部分......尽管构造函数中存在一些差异,为什么在您的示例中出现相同的行为?

$soapVar   = new SoapVar((object) ['Foo' => 'bar'], null, null, null, 'TagName');
$soapParam = new SoapParam((object) ['Foo' => 'bar'], 'TagName');

我并不感到惊讶,如上所述,SOAP结构或CORRECT Soap Structure的PHP变量数据是相同的:)由于面向对象,我们传递了PHP类生成的Object。在SoapVar中,对象的构造有更多选项,从而允许用户针对SOAP调用调整更“安全”的请求。在SoapParam上,可以通过传递任何对象和下一个对象来构造对象。

您的(object) ['Foo' => 'bar']非常简单,不需要XML Schema Encoding,因此接收它的SOAP调用我相信很容易理解它。

不需要
  •   

    编码

  

编码ID,XSD _...常量之一。

这是SoapVar构造函数中的第二个参数。

最后,因为他们都接受了一个对象(任何对象)来代替$data变量,所以SoapVar只是提供了构建更安全的请求的可能性,以便SOAP调用通过额外的参数来理解在构造函数中。 SoapParam只是一个坏蛋,允许你发送任何你喜欢的东西,冒着SOAP拒绝它的风险....它就像是几乎想要充当JSON @ RESTful:P不关心它发送的数据的类型和结构:)

参考文献: