/** * Creates a new object of the given type, using the optional parameters. * When pseudo-namespace support is enabled class names can become very long, * and this function provides an alternative way to create objects that is * more readable. * @param string $type the type of object to create * @param array $params parameters to pass into the constructor, as either * flat array in the correct order for the constructor or as an * associative array from parameter name to value * @return mixed a new instance of a class that represents that type */ public function Create($type, $params = null) { if (array_key_exists($type, $this->options['classmap'])) { $class = $this->options['classmap'][$type]; $reflectionClass = new ReflectionClass($class); if (isset($params)) { if (MapUtils::IsMap($params)) { $params = MapUtils::MapToMethodParameters($params, $reflectionClass->getConstructor()); } return $reflectionClass->newInstanceArgs($params); } else { return $reflectionClass->newInstance(); } } else { trigger_error('Unknown type: ' . $type, E_USER_ERROR); } }
/** * Converts an object to an DOMElement. * @param Object $object the object to serialize * @param string $elementName the name of the element to serialize * @param DOMDocument $document the document that the element will be added to * @return DOMElement the element representing the object */ private static function ConvertObjectToElement($object, $elementName, $document) { if (!isset($object)) { return null; } $element = $document->createElement($elementName); $children = array(); if (is_array($object) && MapUtils::IsMap($object)) { $object = (object) $object; } if (is_object($object)) { foreach (get_object_vars($object) as $field => $value) { if (is_array($value) && !MapUtils::IsMap($value)) { foreach ($value as $item) { $children[] = self::ConvertObjectToElement($item, $field, $document); } } else { $children[] = self::ConvertObjectToElement($value, $field, $document); } } foreach ($children as $child) { if (isset($child)) { $element->appendChild($child); } } } else { $element->nodeValue = self::ConvertObjectToNodeValue($object); } return $element; }
/** * Test determining if an array is a map. * @param array $value the array to evaluate * @param bool $expected the expected result of IsMap() * @covers MapUtils::IsMap * @dataProvider IsMapProvider */ public function testIsMap(array $value, $expected) { $result = MapUtils::IsMap($value); $this->assertEquals($expected, $result); }
/** * Creates an array of child elements for objects. * @param object $object the object whose properties will be serialized * @param DOMDocument $document the document being constructed * @param bool $useXsiType whether the xsi:type will be added into XML tags * when available * @return array an array of child elements created from the specified object */ private function CreateChildListForObjects($object, DOMDocument $document, $useXsiType) { $children = array(); foreach (get_object_vars($object) as $field => $value) { if (is_array($value) && !MapUtils::IsMap($value)) { foreach ($value as $item) { $children[] = self::ConvertObjectToElement($item, $field, $document, $useXsiType); } } else { $children[] = self::ConvertObjectToElement($value, $field, $document, $useXsiType); } } return $children; }