/** * Choose a XML_RPC2_Value subclass appropriate for the * given value and create it. * * This method tries to find the most adequate XML-RPC datatype to hold * a given PHP native type. Note that distinguishing some datatypes may be * difficult: * - Timestamps are represented by PHP integers, so an XML_RPC2_Value_Datetime is never returned * - Indexed arrays and associative arrays are the same native PHP type. In this case: * a) The array's indexes start at 0 or 1 and increase monotonically with step 1, or * b) they do not * in the first case, an XML_RPC2_Value_Array is returned. In the second, a XML_RPC2_Value_Struct is returned. * - PHP Objects are serialized and represented in an XML_RPC2_Value_Base64 * * Whenever native object automatic detection proves inaccurate, use XML_RPC2_Value::createFromNative providing * a valid explicit type as second argument * * the appropriate XML_RPC2_Value child class instead. * * @param mixed The native value * @param string The xml-rpc target encoding type, as per the xmlrpc spec (optional) * @throws XML_RPC2_InvalidTypeEncodeException When the native value has a type that can't be translated to XML_RPC * @return A new XML_RPC2_Value instance * @see XML_RPC_Client::__call * @see XML_RPC_Server */ public static function createFromNative($nativeValue, $explicitType = null) { if (is_null($explicitType)) { switch (gettype($nativeValue)) { case 'boolean': $explicitType = 'boolean'; break; case 'integer': $explicitType = 'int'; break; case 'double': $explicitType = 'double'; break; case 'string': $explicitType = 'string'; break; case 'array': $explicitType = 'array'; $keys = array_keys($nativeValue); if (count($keys) > 0) { if ($keys[0] !== 0 && $keys[0] !== 1) { $explicitType = 'struct'; } $i = 0; do { $previous = $keys[$i]; $i++; if (array_key_exists($i, $keys) && $keys[$i] !== $keys[$i - 1] + 1) { $explicitType = 'struct'; } } while (array_key_exists($i, $keys) && $explicitType == 'array'); } break; case 'object': if (strtolower(get_class($nativeValue)) == 'stdclass' && isset($nativeValue->xmlrpc_type)) { // In this case, we have a "stdclass native value" (emulate xmlrpcext) // the type 'base64' or 'datetime' is given by xmlrpc_type public property $explicitType = $nativeValue->xmlrpc_type; } else { $nativeValue = serialize($nativeValue); $explicitType = 'base64'; } break; case 'resource': case 'NULL': case 'unknown type': throw new XML_RPC2_InvalidTypeEncodeException(sprintf('Impossible to encode value \'%s\' from type \'%s\'. No analogous type in XML_RPC.', (string) $nativeValue, gettype($nativeValue))); default: throw new XML_RPC2_InvalidTypeEncodeException(sprintf('Unexpected PHP native type returned by gettype: \'%s\', for value \'%s\'', gettype($nativeValue), (string) $nativeValue)); } } $explicitType = ucfirst(strtolower($explicitType)); switch ($explicitType) { case 'I4': case 'Int': case 'Boolean': case 'Double': case 'String': require_once 'XML/RPC2/Backend/Php/Value/Scalar.php'; return XML_RPC2_Backend_Php_Value_Scalar::createFromNative($nativeValue); break; case 'Datetime.iso8601': case 'Datetime': require_once 'XML/RPC2/Backend/Php/Value/Datetime.php'; return new XML_RPC2_Backend_Php_Value_Datetime($nativeValue); break; case 'Base64': require_once 'XML/RPC2/Backend/Php/Value/Base64.php'; return new XML_RPC2_Backend_Php_Value_Base64($nativeValue); break; case 'Array': require_once 'XML/RPC2/Backend/Php/Value/Array.php'; return new XML_RPC2_Backend_Php_Value_Array($nativeValue); break; case 'Struct': require_once 'XML/RPC2/Backend/Php/Value/Struct.php'; return new XML_RPC2_Backend_Php_Value_Struct($nativeValue); break; default: throw new XML_RPC2_InvalidTypeEncodeException(sprintf('Unexpected explicit encoding type \'%s\'', $explicitType)); } }
/** * Constructor. Will build a new XML_RPC2_Value_Boolean with the given value * * @param mixed value */ public function __construct($nativeValue) { parent::__construct('boolean', $nativeValue); }