#34218 [Opn->Fbk]: Problem with inheritance (by extension) in request (methods argument)
ID: 34218
Updated by: sniper@php.net
Reported By: Wojciech dot Szela at gmail dot com
-Status: Open
+Status: Feedback
Bug Type: SOAP related
Operating System: SuSe Linux 9.3
PHP Version: 5.0.4
New Comment:
Please try using this CVS snapshot:
http://snaps.php.net/php5-latest.tar.gz
For Windows:
http://snaps.php.net/win32/php5-win32-latest.zip
Previous Comments:
------------------------------------------------------------------------
[2005-08-23 10:16:12] Wojciech dot Szela at gmail dot com
Description:
------------
There's a problem with objects' class name received by soap server,
when passed in request object is inheriting from other one. For
example:
data type definition in wsdl:
<xsd:complexType name="Vehicle">
<xsd:all>
<xsd:element name="loadWeight" type="xsd:int"></xsd:element>
</xsd:all>
</xsd:complexType>
<xsd:complexType name="Car">
<xsd:complexContent>
<xsd:extension base="tns:Vehicle">
<xsd:all>
<xsd:element name="engineNumber"
type="xsd:string"></xsd:element>
</xsd:all>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
Second object is inheriting from the first one. And we have operation
defined like that:
<wsdl:message name="addCarResponse">
<wsdl:part name="return" type="tns:Car"></wsdl:part>
</wsdl:message>
<wsdl:message name="addCarRequest">
<wsdl:part name="car" type="tns:Car"></wsdl:part>
</wsdl:message>
<wsdl:operation name="addCar">
<soap:operation
soapAction="http://www.foo.com/VehicleService/addCar"/>
<wsdl:input>
<soap:body use="encoded"
namespace="http://www.foo.com/VehicleService/"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</wsdl:input>
<wsdl:output><soap:body use="encoded"
namespace="http://www.foo.com/VehicleService/"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</wsdl:output>
</wsdl:operation>
Soap client is written in Java (axis). Method addCar is invoked with
variable of type Car. Soap server (PHP5) receives proper structure of
object - it has all fields, inherited from father and it's own, but
get_class(passedObject) returns father's class name (Vehicle). Class
mapping is correct. WSDL file is correct. Even returned object, also of
type Car, is correct.
Reproduce code:
---------------
$classmap = array( 'Car' => 'Car', 'Vehicle' =>
'Vehicle' );
class fooService {
public addCar($car) {
$fh = fopen("foo.txt","a+"); fwrite($fh,get_class($car)+"\n");
fwrite($fh,var_export($car,true)); fclose($fh);
$storedObject = $this->storeInDB($car);
return $storedObject;
}
ini_set('soap.wsdl_cache_enabled',"0");
$server = new SoapServer('fooService.wsdl',array('classmap' =>
$classmap');
$server->setClass(fooService);
$server->handle();
Expected result:
----------------
File content:
Car
Car: loadWeight->someValue
Car: engineNumber->someOtherValue
Actual result:
--------------
File content:
Vehicle
Vehicle: loadWeight->someValue
Vehicle: engineNumber->someOtherValue
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=34218&edit=1
Thread (5 messages)