Ejemplo n.º 1
0
 private static function prepareForSerize(\ReflectionAnnotatedClass $reflection, $object, $parent = false)
 {
     $hash = spl_object_hash($object);
     if (in_array($hash, self::$prepared) && $parent == false) {
         return;
     }
     array_push(self::$prepared, $hash);
     $globalAltered = false;
     $defaults = null;
     foreach ($reflection->getProperties() as $property) {
         $altered = false;
         $property->setAccessible(true);
         $value = $property->getValue($object);
         if (self::isTransient($property)) {
             $defaults = $defaults == null ? $reflection->getDefaultProperties() : $defaults;
             $name = $property->getName();
             $property->setValue($object, array_key_exists($name, $defaults) ? $defaults[$name] : null);
             $altered = true;
         } else {
             if (is_object($value) && $value instanceof \Closure) {
                 $property->setValue($object, new SerializableClosure($value));
                 $altered = true;
             } else {
                 if (is_object($value) && !$value instanceof SerializableClosure && spl_object_hash($value) != $hash) {
                     $valueReflection = new \ReflectionAnnotatedClass($value);
                     $altered = self::prepareForSerize($valueReflection, $value);
                 } else {
                     if (is_array($value)) {
                         $newValue = self::prepareArrayForSerialize($value);
                         if (is_array($newValue)) {
                             $property->setValue($object, $newValue);
                             $altered = true;
                         }
                     }
                 }
             }
         }
         if ($altered) {
             self::addRestore($property, $object, $value);
             $globalAltered = true;
         }
     }
     $parent = $reflection->getParentClass();
     if ($parent != null) {
         self::prepareForSerize($parent, $object, true);
     }
     if (!$parent) {
         if ($object instanceof Detachable) {
             $object->detach();
         }
     }
     return $globalAltered;
 }