|
1 | 1 | <?php |
2 | 2 | namespace FedEx; |
3 | 3 |
|
| 4 | +use ReflectionClass; |
| 5 | +use ReflectionMethod; |
| 6 | +use ReflectionNamedType; |
| 7 | + |
4 | 8 | /** |
5 | 9 | * Abstract class for SimpleTypes |
6 | 10 | * |
@@ -67,11 +71,14 @@ public function &__get($name) |
67 | 71 | } |
68 | 72 |
|
69 | 73 | $setterMethodName = "set{$name}"; |
70 | | - $reflectionClass = new \ReflectionClass($this); |
| 74 | + $reflectionClass = new ReflectionClass($this); |
71 | 75 | if ($reflectionClass->hasMethod($setterMethodName)) { |
72 | | - $parameterClass = $reflectionClass->getMethod($setterMethodName)->getParameters()[0]->getClass(); |
73 | | - if (!empty($parameterClass)) { |
74 | | - $this->$setterMethodName(new $parameterClass->name()); |
| 76 | + $reflectionNamedType = $reflectionClass->getMethod($setterMethodName)->getParameters()[0]->getType(); |
| 77 | + /* @var $reflectionNamedType ReflectionNamedType */ |
| 78 | + $parameterClassName = $reflectionNamedType->getName(); |
| 79 | + |
| 80 | + if (class_exists($parameterClassName)) { |
| 81 | + $this->$setterMethodName(new $parameterClassName); |
75 | 82 | return $this->values[$name]; |
76 | 83 | } |
77 | 84 | } |
@@ -138,48 +145,50 @@ public function toArray($renderTopKey = false) |
138 | 145 | */ |
139 | 146 | public function populateFromStdClass(\stdClass $stdClass) |
140 | 147 | { |
141 | | - $reflectionClass = new \ReflectionClass($this); |
| 148 | + $reflectionClass = new ReflectionClass($this); |
142 | 149 |
|
143 | | - $setterMethods = array_filter($reflectionClass->getMethods(\ReflectionMethod::IS_PUBLIC), function ($reflectionMethod) { |
| 150 | + $setterMethods = array_filter($reflectionClass->getMethods(ReflectionMethod::IS_PUBLIC), function ($reflectionMethod) { |
144 | 151 | return (preg_match('/^set.*$/', $reflectionMethod->name)); |
145 | 152 | }); |
146 | 153 |
|
147 | 154 | foreach ($setterMethods as $reflectionMethod) { |
148 | | - /* @var $reflectionMethod \ReflectionMethod */ |
| 155 | + /* @var $reflectionMethod ReflectionMethod */ |
149 | 156 | $methodName = $reflectionMethod->name; |
150 | 157 | $stdPropertyName = str_replace('set', '', $methodName); |
151 | 158 | $parameterValue = null; |
152 | 159 | $reflectionParameter = $reflectionMethod->getParameters()[0]; |
153 | | - |
154 | | - if ($reflectionParameter->getClass() instanceof \ReflectionClass) { |
155 | | - //class |
156 | | - $classPropertyName = $reflectionParameter->getClass()->name; |
157 | | - $parameterValue = new $classPropertyName; |
158 | | - if (isset($stdClass->$stdPropertyName)) { |
159 | | - $parameterValue->populateFromStdClass($stdClass->$stdPropertyName); |
160 | | - } |
161 | | - } elseif ($reflectionParameter->isArray()) { |
162 | | - //array |
163 | | - $arrayType = Reflection::getAbstractClassSetterMethodArrayType($reflectionParameter); |
164 | | - if (Reflection::isClassNameSimpleType($arrayType)) { |
165 | | - } else { |
166 | | - if (isset($stdClass->$stdPropertyName)) { |
167 | | - $parameterValue = []; |
168 | | - if (is_array($stdClass->$stdPropertyName)) { |
169 | | - foreach ($stdClass->$stdPropertyName as $property) { |
| 160 | + $reflectionParameterType = $reflectionParameter->getType(); |
| 161 | + |
| 162 | + if ($reflectionParameterType instanceof ReflectionNamedType) { |
| 163 | + if ($reflectionParameterType->getName() === 'array') { |
| 164 | + // array |
| 165 | + $arrayType = Reflection::getAbstractClassSetterMethodArrayType($reflectionParameter); |
| 166 | + if (!Reflection::isClassNameSimpleType($arrayType)) { |
| 167 | + if (isset($stdClass->$stdPropertyName)) { |
| 168 | + $parameterValue = []; |
| 169 | + if (is_array($stdClass->$stdPropertyName)) { |
| 170 | + foreach ($stdClass->$stdPropertyName as $property) { |
| 171 | + $class = new $arrayType; |
| 172 | + $parameterValue[] = $class; |
| 173 | + $class->populateFromStdClass($property); |
| 174 | + } |
| 175 | + } else { |
170 | 176 | $class = new $arrayType; |
171 | 177 | $parameterValue[] = $class; |
172 | | - $class->populateFromStdClass($property); |
| 178 | + $class->populateFromStdClass($stdClass->$stdPropertyName); |
173 | 179 | } |
174 | | - } else { |
175 | | - $class = new $arrayType; |
176 | | - $parameterValue[] = $class; |
177 | | - $class->populateFromStdClass($stdClass->$stdPropertyName); |
178 | 180 | } |
179 | 181 | } |
| 182 | + } elseif (!$reflectionParameterType->isBuiltin()) { |
| 183 | + //class |
| 184 | + $classPropertyName = $reflectionParameterType->getName(); |
| 185 | + $parameterValue = new $classPropertyName(); |
| 186 | + if (isset($stdClass->$stdPropertyName)) { |
| 187 | + $parameterValue->populateFromStdClass($stdClass->$stdPropertyName); |
| 188 | + } |
180 | 189 | } |
181 | 190 | } else { |
182 | | - //is scalar type |
| 191 | + // is scalar type |
183 | 192 | if (isset($stdClass->$stdPropertyName)) { |
184 | 193 | $parameterValue = $stdClass->$stdPropertyName; |
185 | 194 | } |
|
0 commit comments