PHP and WDDXAs previously stated, a WDDX module has been available for PHP since version 4.0 of the language. Created by Andrei Zmievski, this WDDX module includes standard serialization and deserialization functions to convert PHP variables and arrays into WDDX-compatible data structures. If you're using a stock PHP binary, it's quite likely that you'll need to recompile PHP to add support for this library to your PHP build (detailed instructions for accomplishing this are available in Appendix A, "Recompiling PHP to Add XML Support"). Encoding Data with WDDXPHP's WDDX module offers a number of different ways to encode data into WDDX. The following sections demonstrate this by using the following: The wddx_serialize_value() function The wddx_serialize_vars() function The wddx_add_vars() function The wddx_serialize_value() FunctionThe simplest way to encode data into WDDX (and the one I will use most frequently in this chapter) is via the wddx_serialize_value() function, which is used to encode a single variable into WDDX. Listing 5.3 demonstrates its application. Listing 5.3 Serializing a Single Variable with wddx_serialize_value()
Listing 5.4 demonstrates the result. Listing 5.4 A WDDX Packet Generated via wddx_serialize_value()
As Listings 5.5 and 5.6 demonstrate, this works with arrays, too. Listing 5.5 Serializing a PHP Array with wddx_serialize_value()
Listing 5.6 A WDDX Packet Representing an Array
An optional second parameter to wddx_serialize_value() lets you add a human-readable comment to the resulting packet. Listing 5.7 is a variant of Listing 5.5 that demonstrates this, with the output shown in Listing 5.8.
Listing 5.7 Adding a Comment to a WDDX Packet
Listing 5.8 A WDDX Packet with a Human-Readable Comment in the Header
The wddx_serialize_vars() FunctionThe wddx_serialize_value() function cannot accept more than a single variable. However, it's also possible to serialize more than one variable at a time with the wddx_serialize_vars() function, which can accept multiple variables for serialization as function arguments. Listing 5.9 demonstrates how this works. Listing 5.9 Serializing Multiple Values with wddx_serialize_vars()
Note that wddx_serialize_vars() requires the names of the variables to be serialized as string arguments. Listing 5.10 displays the result of a wddx_serialize_vars() run. Listing 5.10 A WDDX Packet Generated via wddx_serialize_vars()
It's interesting to note, also, that wddx_serialize_value() and wddx_serialize_vars() generate significantly different (though valid) WDDX packets. Consider Listing 5.11, which creates a WDDX packet containing the same variable-value pair as Listing 5.3, and compare the resulting output in Listing 5.12 with that in Listing 5.4. Listing 5.11 Serializing a Single Variable with wddx_serialize_vars()
Listing 5.12 A WDDX Packet Generated via wddx_serialize_vars()
The wddx_add_vars() FunctionPHP also allows you to build a WDDX packet incrementally, adding variables to it as they become available, with the wddx_add_vars() function. Listing 5.13 demonstrates this approach, building a WDDX packet from the results of a form POST operation. Listing 5.13 Building a WDDX Packet Incrementally with wddx_add_vars()
This is a slightly more complicated technique than the ones described previously. Let's go through it step by step: The first order of business is to create an empty WDDX packet to hold the data; this is accomplished with the aptly named wddx_packet_start() function, which returns a handle for the newly minted packet.
This handle is used in all subsequent operations. Note that the wddx_packet_start() function can be passed an optional comment string, which is used to add a comment to the header of the generated packet. With the packet created, the next step is to add data to it. In Listing 5.13, the data is generated dynamically from a form submission, and each value is then added to the packet via the wddx_add_vars() function.
This function works in much the same way as wddx_serialize_vars() it accepts multiple variable names as argument (although I've only used one here), serializes these variables into WDDX structures, and adds them to the packet. Note, however, that wddx_add_vars() requires, as first argument, the handle representing the packet to which the data is to be added. After all the required data has been inserted into the packet, the final step is to close the packet, accomplished via the wddx_packet_end() function. Again, the packet handle is used to identify the packet to be closed.
Note that the wddx_packet_end() function returns the contents of the newly minted packet; this return value can be assigned to a variable and used in subsequent lines of the PHP script. This approach comes in particularly handy if you're dealing with dynamically generated data, either from a database or elsewhere. With your data now safely encoded into WDDX, let's now look at how you can convert it back into usable PHP data structures. Decoding Data with WDDXAlthough there are five different functions available to encode data into WDDX, PHP has only a single function to perform the deserialization of WDDX packets. This function is named wddx_deserialize(), and it accepts a string containing a WDDX packet as its only argument. Listing 5.14 demonstrates how a PHP variable encoded in WDDX can be deserialized by wddx_deserialize(). Listing 5.14 Deserializing a WDDX Packet into a Native PHP Structure
This works with arrays, tooin Listing 5.15, the deserialized result $output is an array containing the same elements as the original array $stooges. Listing 5.15 Deserializing a WDDX Packet into a PHP Array
|