fruffl icon

object::shallowCopy

fruffl | 09/27/15 06:30:25 PM UTC | 0 ⭐ | 285 👁️ | Never ⏰ | []
PHP |

1.97 KB

|

None

|

0 👍

/

0 👎

 
        function Core_Std_DefaultObject___trait_IDefaultObject_shallowCopy()
        {
            $A = new SPLReflectionObject($this);
            $B = new SPLReflectionClass(static::class);
            $C = $B->newInstanceWithoutConstructor();
            
            $propertiesA = $A->getProperties();
            $propertiesB = $B->getProperties();
            
            foreach(array_keys($propertiesB) as $k)
            {
                if($propertiesB[$k]->isStatic()) //! it's PHP... http://stackoverflow.com/questions/15783984/reflection-properties-filter
                    continue;
                
                $propertiesA[$k]->setAccessible(TRUE);
                $propertiesB[$k]->setAccessible(TRUE);
                
                $value = $propertiesA[$k]->getValue($this);
                $value = $this->__Core_Std_DefaultObject___trait_IDefaultObject___copyRecursive($C, FALSE, $value);
                
                $propertiesB[$k]->setValue($C, $value);
            }
            
            return $C;
        }
 
        private function __Core_Std_DefaultObject___trait_IDefaultObject___copyRecursive(IDefaultObject $__Context, $__isDeep = FALSE, $__data)
        {
            if($__data === $__Context)
                return $__data;
            
            if(is_array($__data))
            {
                foreach($__data as $k => $value)
                    $__data[$k] = $this->{__FUNCTION__}($__Context, $__isDeep, $value);
                
                return $__data;
            }
            
            if(FALSE === is_object($__data))
                return $__data;
            
            if(TRUE === $__isDeep)
            {
                switch(TRUE):
                    case $__data instanceOf IDefaultObject:
                        $__data = $__data->deepCopy();
                        break;
                    case $__data instanceOf SPLClosure:
                        $__data = $__data->bindTo($__Context, $__Context);
                        break;
                    case $__data instanceOf Fn:
                        $__data = $__data->bind($__Context, $__Context);
                        break;
                    default:
                        $__data = clone $__data;
                endswitch;
            }
            else
            {
                switch(TRUE):
                    case $__data instanceOf SPLClosure:
                        $__data = $__data->bindTo($__Context, $__Context);
                        break;
                    case $__data instanceOf Fn:
                        $__data = $__data->bind($__Context, $__Context);
                        break;
                endswitch;
            }
            
            return $__data;
        }

Comments