$value) { if (property_exists($destination, $name)) { if (is_object($value)) { if (is_object($destination->$name)) { static::recursivelyCopyObjectProperties($value, $destination->$name); } else { throw new Exception("Source property $name is an object, which is not expected"); } } elseif (is_array($value)) { if (is_array($destination->$name)) { $itemClass = $destination->itemClass($name); foreach ($value as $sourceItem) { if ('string' === $itemClass) { $destination->$name[] = $sourceItem; } else { $item = new $itemClass(); static::recursivelyCopyObjectProperties($sourceItem, $item); $destination->$name[] = $item; } } } else { throw new Exception("Source property $name is an array, which is not expected"); } } else { $destination->$name = $value; } } else { error_log("Source object has property $name, which was not expected: ".json_encode($source)); } } $destination->initializeExtraProperties(); } }