SoapVar和SoapParam有什么区别?

Rob*_*bok 8 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');
Run Code Online (Sandbox Code Playgroud)

在大多数SoapClient教程中,每当有人想要设置自定义时,我都会看到SoapParam里面的片段:SoapVarxsi:type

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

这实在是直观的,因为SoapVarSoapParam类的名称不太多发言权.通过更优雅可以实现相同的结果:

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

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

oet*_*oni 6

你说得对,手册有点含糊不清地解释了理论上的确切差异,我很惊讶直到现在没有人指出一些详细的信息或解释他们的差异。

按说明书

肥皂参数:

表示 SOAP 调用的参数。

肥皂值:

表示用于 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 ]]]] )where $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"));
?>
Run Code Online (Sandbox Code Playgroud)

在那里$a$b并且$c是PHP变量直接发送,而不使其通过结构/类。SaopParam 构造函数正在获取参数$data(PHP 变量)和代表参数名称的字符串。

在另一边 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"));
?>
Run Code Online (Sandbox Code Playgroud)

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

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

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

我并不感到惊讶,如上所述,SOAP 结构或正确 Soap 结构的 PHP 变量的数据是相同的 :) 由于面向对象,我们传递了由 PHP 类生成的对象。在SoapVar对象的构造上有更多的选择,从而允许用户适应对 SOAP 调用的更“安全”的请求。而在SoapParam该对象可以通过传递任何对象,未来它的名字来构建。

(object) ['Foo' => 'bar']非常简单,不需要 XML 模式编码,因此接收它的 SOAP 调用我相信可以很容易地理解它。它不需要

  • 编码

编码 ID,XSD_... 常量之一。

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

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

参考: