Signatur
Beschreibung
SoapVar wird verwendet, wenn ein SOAP-Client oder -Server einen Wert mit einem expliziten XML-Schematyp übermitteln soll, der nicht automatisch aus dem PHP-Typ abgeleitet werden kann. Dies ist besonders wichtig bei encoded-SOAP-Stilen sowie bei polymorphen Typen, bei denen der eigentliche XML-Typ im SOAP-Envelope explizit angegeben werden muss.
Beim Aufbau von SOAP-Nachrichten kann PHP in vielen Fällen den korrekten XML-Typ selbst bestimmen. Sobald jedoch benutzerdefinierte XML-Typen, Typen aus anderen Namespaces oder komplexe Vererbungshierarchien ins Spiel kommen, muss der Entwickler den Typ manuell über SoapVar steuern. Der Kodierungstyp wird über vordefinierte PHP-Konstanten wie XSD_STRING, XSD_INT, SOAP_ENC_OBJECT oder XSD_ANYTYPE angegeben.
Ein typischer Anwendungsfall ist das Übermitteln eines Werts mit einem nicht standardmäßigen oder namespace-qualifizierten Typ, z. B. wenn ein WSDL-Schema einen eigenen komplexen Typ definiert und dieser korrekt mit xsi:type im gesendeten XML auftauchen soll. SoapVar erlaubt außerdem die Angabe eines benutzerdefinierten Typ-Namens, Namespaces und Knotennamens für das erzeugte XML-Element.
Die Klasse besitzt keine eigenständigen öffentlichen Methoden; ihr Zweck beschränkt sich auf die Datenhaltung für die interne SOAP-Serialisierung durch die SoapClient- und SoapServer-Komponenten.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $data Pflicht | mixed | Der eigentliche Wert, der in der SOAP-Nachricht übertragen werden soll. Kann ein skalarer Wert, ein Array oder ein Objekt sein. | |
| $encoding Pflicht | int | Gibt den SOAP-Kodierungstyp als Ganzzahl-Konstante an, z. B. XSD_STRING, XSD_INT, XSD_BOOLEAN, SOAP_ENC_OBJECT, SOAP_ENC_ARRAY oder XSD_ANYTYPE. |
|
| $type_name | string | Optionaler Name des XML-Typs (z. B. der Name eines benutzerdefinierten komplexen Typs), der im erzeugten SOAP-XML als xsi:type-Attribut erscheint. |
|
| $type_namespace | string | Optionaler Namespace-URI für den unter type_name angegebenen Typ. Wird für benutzerdefinierte oder namespace-qualifizierte XML-Schematypen benötigt. |
|
| $node_name | string | Optionaler Name des XML-Elements (Knotenname), das im SOAP-Envelope für diesen Wert erzeugt wird. | |
| $node_namespace | string | Optionaler Namespace-URI für den XML-Knoten, dessen Name über node_name angegeben wird. |
Beispiele
Einfacher XSD-String-Wert mit explizitem Typ
<?php
$client = new SoapClient('http://example.com/service?wsdl');
// Wert als expliziter XSD_STRING übergeben
$param = new SoapVar('Hallo Welt', XSD_STRING);
$result = $client->greet(['message' => $param]);
var_dump($result);
Benutzerdefinierter komplexer Typ mit eigenem Namespace
<?php
// Komplexen Typ aus einem eigenen Schema als SoapVar kapseln
$address = new stdClass();
$address->street = 'Musterstraße 1';
$address->city = 'Berlin';
$address->zip = '10115';
$soapAddress = new SoapVar(
$address,
SOAP_ENC_OBJECT,
'Address', // xsi:type-Name
'http://example.com/schema', // Typ-Namespace
'address', // Knotenname im XML
'http://example.com/schema' // Knoten-Namespace
);
$client = new SoapClient('http://example.com/service?wsdl');
$result = $client->createOrder(['deliveryAddress' => $soapAddress]);
var_dump($result);
Numerischen Wert als XSD_INT übergeben
<?php
$client = new SoapClient(null, [
'location' => 'http://example.com/soap',
'uri' => 'http://example.com/ns',
'style' => SOAP_RPC,
'use' => SOAP_ENCODED,
]);
$quantity = new SoapVar(42, XSD_INT);
$result = $client->setQuantity(new SoapParam($quantity, 'quantity'));
print_r($result);
// Wichtig · Fallstricke
Kodierungs-Konstanten: Für encoding stehen u. a. folgende Konstanten zur Verfügung: XSD_STRING, XSD_INT, XSD_FLOAT, XSD_DOUBLE, XSD_BOOLEAN, XSD_DATETIME, XSD_BASE64BINARY, XSD_ANYTYPE, SOAP_ENC_OBJECT, SOAP_ENC_ARRAY. Diese Konstanten sind im PHP-SOAP-Modul definiert und entsprechen den XML-Schema-Typen.
Nur bei aktivierter SOAP-Extension: SoapVar erfordert die PHP-SOAP-Extension (ext/soap). Ist diese nicht geladen, steht die Klasse nicht zur Verfügung.
Kein WSDL-Modus nötig: SoapVar ist sowohl im WSDL-Modus als auch im WSDL-losen Modus einsetzbar, wobei sie im WSDL-losen Modus (uri/location) besonders häufig benötigt wird, da dort keine automatische Typ-Ableitung aus der WSDL stattfindet.