|
 |
SoapVar->__construct() (no version information, might be only in CVS) SoapVar->__construct() --
SoapVar constructor
Описаниеclass SoapVar { __construct ( mixed data, int encoding [, string type_name [, string type_namespace [, string node_name [, string node_namespace]]]] ) }
Constructs a new SoapVar object.
Список параметров
- data
The data to pass or return.
- encoding
The encoding ID, one of the XSD_... constants.
- type_name
The type name.
- type_namespace
The type namespace.
- node_name
The XML node name.
- node_namespace
The XML node namespace.
Примеры
Пример 1. Some examples
<?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"));
?>
|
|
SoapVar->__construct()
OrionI
11-Jul-2005 07:30
This class is useful when dealing with the "anyType" type (generic object reference): it lets you specify the xsd type to provide "late binding" type information.
Here's a really simple example: I have a .NET service that can take a string, a date, and integer, or other types, so I use the .NET "object" type. Here's an example of such a service--this one just tells me what type I passed in. (It's nice to use when checking to see if PHP passed in the type information the way .NET expects it.)
//inside a service.asmx.cs file...
[WebMethod]
public string WhatTypeIsThis(object ObjectParameter)
{
return "You passed in a " + ObjectParameter.GetType().Name
+ ": " + ObjectParamter.ToString();
}
To call this service with a string from PHP, I used this code:
<?php
$client = new SoapClient("http://localhost/folder/service.asmx?WSDL");
$typedVar = new SoapVar("mystring", XSD_STRING, "string", "http://www.w3.org/2001/XMLSchema");
$wrapper->ObjectParameter = $typedVar;
$params = new SoapParam($wrapper, "WhatTypeIsThis");
$result = $client->WhatTypeIsThis($params);
echo $result->WhatTypeIsThisResult;
?>
The output from this should be:
"You passed in a String: mystring"
The SOAP message that is passed in looks like this:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns1="http://tempuri.org/">
<SOAP-ENV:Body>
<ns1:WhatTypeIsThis>
<ns1:ObjectParameter xsi:type="xsd:string">mystring</ns1:ObjectParameter>
</ns1:WhatTypeIsThis>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
It's that xsi:type="xsd:string" that gives .NET the heads up that though the ObjectParameter is being passed in as an object, it is also a string.
When trying other types, it's helpful to see exactly what is being sent to the service--to see the SOAP messages like the one above, use the trace option when making your SOAP client and then call the $client->__getLastRequest() function. (See soap_soapclient_getlastrequest) You may need to use try/catch constructs if you're generating errors.
Another helpful function is var_dump($client->__getTypes())--it shows how PHP parsed the WSDL file to create types to pass back and forth.
| |