As many of other languages, XML schema too have data types. Basically it can be categorized in to two groups.
- Simple Types
- Complex Types
The different between these 2 types are so easy to identify. Say you have a schema element with a simple type like this.
<xs:element name="xx" type="someSimpleType"/>
Then a possible xml to validate against this schema is
<xx>Bingo</x>
Inside the ‘xxx’ you can only find texts, But in a case of a schema element with complex types,
<xs:element name="xx" type="someComplexType"/>
The XML will be set of nested elements.
<xx> <yy>hi</yy> <zz>Nested elements</zz> </xx>
Simply complex type contains elements with simple types or complex types similar to the class types in OOP languages which contain member variables with different types.
But unlike most of the other languages, in schema simple types are not always primitive types. There can be user derived simple types as well.
I will talk about each of these variations in schema types and their PHP representation of WSDL2PHP tool.
- Primitive Types & Built-in Types
- List Types
- Union Types
- Faceted Types
Primitive Types & Built-in Types
The XML schema specification talks about 19 primitive types. Some of the common of these simple types and the corresponding PHP types generated by WSDL2PHP tool are,
Schema Type | PHP Type |
string | string |
boolean | boolean |
decimal | float |
float | float |
double | double |
duration | string |
dateTime | string (from above wsf/php 2.0 it is an integer – representing timestamp) |
You may have noticed the famous types like ‘integer’, ‘byte’, ‘short’ are missing out of the above list. In fact these types exist, but they are not primitive types. They are derived from decimal (special cases when the fraction digits are 0 :). Anyway still these types are considered built-in types in xml schema. Here is the complete list of built-in types (both primitive and non-primitive built-in types)
‘integer’, ‘byte’ and ‘short’ are mapped to PHP integer types by the WSDL2PHP tool.
To show an example how WSDL2PHP tool generating code for simple types, I will take the following schema Element.
<xs:element name="myName" type="xs:string"/>
And WSDL2PHP will generate a simple public variable (Assuming this is generating inside some class) for that element with a comment to describing it.
/** * @var string */ public $myName;
So if I specified some value for the variable (Taking the variable name of the parent class is $parent),
$parent->myName = "James";
I will get the following nice XML.
<myName>James</myName>
This is the same approach for all the other built-in types as well.
List Types
The list types are derived from list of simple types. It still a simple type because it list all the element in the list as a white-space separated text inside the parent element.
Here is how you may declare a list type in an xml schema.
<xs:simpleType name="mylist"> <xs:list itemType="xs:int"/> </xs:simpleType> <!-- example element to have the above list value --> <xs:element name="xCoordinates" type="tns:mylist"/>
Then the WSDL2PHP generated PHP code would be something like,
/** * @var array of int */ public $xCoordinates;
As the comment implies, you have to feed the values in an php array.
$parent->xCoordinates = array(1, 3, 8, 7, 9);
And Here is the XML you are getting,
<xCoordinates>1 3 8 7 9</xCoordinates>
Similarly you can have list of any simple types regardless whether it is built-in or derived.
Union Types
The union in schema is similar to the unions in ‘C’. In C variables of a union can have one (and not more than one) of the types declared inside the union type. Similarly in schema elements with union types can have one and only one simple type among the member types declared in the union. Here is an example of declaring union type,
<xs:simpleType name="myIntStringUnion"> <xs:union memberTypes="xs:int xs:string"/> </xs:simpleType> <!-- example element to have the above union value --> <xs:element name="garbage" type="tns:myIntStringUnion"/>
And the WSDl2PHP generated code,
/** * @var int/string */ public $garbage;
So if you read the comment you can have an idea that this variable accept either ‘in’ or ‘string’ type without digging in to the WSDL.
Faceted Types
You can apply facets and restrict the value space of a simple type.
- length
- minLength
- maxLength
- pattern
- enumeration
- whiteSpace
- maxInclusive
- maxExclusive
- minExclusive
- minInclusive
- totalDigits
- fractionDigits
Some facets are specific to some built-in data types or types derived from these built-in datatypes. Here is a table of valid facets for each of the above mentioned catagory of types.
I have earlier blogged about how you work on faceted types in PHP in the post “Coding Schema Inheritance in PHP“. So Here I will list out a similar example to demonstrate the PHP generated code by WSDL2PHP tool for facets.
Here is a schema with the ‘enumeration’ facet.
<!-- applying enumeration facet to the xs:string --> <xs:simpleType name="mySubject"> <xs:restriction base="xs:string"> <xs:enumeration value="Maths"/> <xs:enumeration value="Physics"/> <xs:enumeration value="Chemistry"/> </xs:restriction> </xs:simpleType> <!-- example element to have the above faceted value --> <xs:element name="subject" type="tns:mySubject"/>
And here is the WSDL2PHP generated code,
/** * @var string * NOTE: subject should follow the following restrictions * You can have one of the following value * Maths * Physics * Chemistry */ public $subject;
It clearly says your variable ‘subject’ is only allowed to have the list of values mentioned in the ‘enumeration’.
So I just wrote about some variations of simple schema types and how they are represented in the WSDL2PHP generated code. As you may have observed, you don’t need to know any thing about the WSDL or the schema to write a PHP code around that, since WSDL2PHP gives you a generated code mentioning all the guidelines, restrictions about using them.
Hi dimuthu,
I believe I found a glitch in how wsdl2php treats the minLength / maxLength facets.
The generated comments say the value should be “Less than” or “Greater than”, while according to the facets’ definition the allowed values include the min/max extremes: in other words, wsdl2php should generate “Less than or equal to” and “Greater than or equal to” instead.
Keep up the good work!
Hi Massimo,
Thanks very much for the input, I will correct it for the next release.
Thanks
Dimuthu
Hi!
How about going from PHP to WSDL with the WSF PHP WSDL Generation API?
For instance how do I write the PHP classes and documentation so that the WSDL contains a simpleType element with an enumaration facet?
Regards Emil
Hi,
Unfortunately that kind of syntax is not there. You have to manually edit the wsdl in such cases. All the supported annotation syntax can be found here, http://wso2.org/project/wsf/php/2.0.0/docs/wsdl_generation_api.html
Thanks
Dimuthu
Well, thanks for the reply. Now I can stop chasing around for that syntax.
Any plans for implementing such a syntax?
Thanks for your quick response!
Regards Emil