Вход Регистрация
Файл: vendor/symfony/var-exporter/Internal/LazyObjectState.php
Строк: 115
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace SymfonyComponentVarExporterInternal;

use 
SymfonyComponentVarExporterHydrator as PublicHydrator;

/**
 * Keeps the state of lazy objects.
 *
 * As a micro-optimization, this class uses no type declarations.
 *
 * @internal
 */
class LazyObjectState
{
    public const 
STATUS_UNINITIALIZED_FULL 1;
    public const 
STATUS_UNINITIALIZED_PARTIAL 2;
    public const 
STATUS_INITIALIZED_FULL 3;
    public const 
STATUS_INITIALIZED_PARTIAL 4;

    
/**
     * @var array<string, true>
     */
    
public readonly array $skippedProperties;

    
/**
     * @var self::STATUS_*
     */
    
public int $status 0;

    public 
object $realInstance;

    public function 
__construct(public readonly Closure|array $initializer$skippedProperties = [])
    {
        
$this->skippedProperties $skippedProperties;
        
$this->status is_array($initializer) ? self::STATUS_UNINITIALIZED_PARTIAL self::STATUS_UNINITIALIZED_FULL;
    }

    public function 
initialize($instance$propertyName$propertyScope)
    {
        if (
self::STATUS_INITIALIZED_FULL === $this->status) {
            return 
self::STATUS_INITIALIZED_FULL;
        }

        if (
is_array($this->initializer)) {
            
$class $instance::class;
            
$propertyScope ??= $class;
            
$propertyScopes Hydrator::$propertyScopes[$class];
            
$propertyScopes[$k "$propertyScope$propertyName"] ?? $propertyScopes[$k "*$propertyName"] ?? $k $propertyName;

            if (
$initializer $this->initializer[$k] ?? null) {
                
$value $initializer(...[$instance$propertyName$propertyScopeLazyObjectRegistry::$defaultProperties[$class][$k] ?? null]);
                
$accessor LazyObjectRegistry::$classAccessors[$propertyScope] ??= LazyObjectRegistry::getClassAccessors($propertyScope);
                
$accessor['set']($instance$propertyName$value);

                return 
$this->status self::STATUS_INITIALIZED_PARTIAL;
            }

            if (
$initializer $this->initializer[""] ?? null) {
                if (!
is_array($values $initializer($instanceLazyObjectRegistry::$defaultProperties[$class]))) {
                    throw new 
TypeError(sprintf('The lazy-initializer defined for instance of "%s" must return an array, got "%s".'$classget_debug_type($values)));
                }
                
$properties = (array) $instance;
                foreach (
$values as $key => $value) {
                    if (!
array_key_exists($key$properties) && [$scope$name$readonlyScope] = $propertyScopes[$key] ?? null) {
                        
$scope $readonlyScope ?? ('*' !== $scope $scope $class);
                        
$accessor LazyObjectRegistry::$classAccessors[$scope] ??= LazyObjectRegistry::getClassAccessors($scope);
                        
$accessor['set']($instance$name$value);

                        if (
$k === $key) {
                            
$this->status self::STATUS_INITIALIZED_PARTIAL;
                        }
                    }
                }
            }

            return 
$this->status;
        }

        if (
self::STATUS_INITIALIZED_PARTIAL === $this->status) {
            return 
self::STATUS_INITIALIZED_PARTIAL;
        }

        
$this->status self::STATUS_INITIALIZED_PARTIAL;

        try {
            if (
$defaultProperties array_diff_key(LazyObjectRegistry::$defaultProperties[$instance::class], $this->skippedProperties)) {
                
PublicHydrator::hydrate($instance$defaultProperties);
            }

            (
$this->initializer)($instance);
        } catch (
Throwable $e) {
            
$this->status self::STATUS_UNINITIALIZED_FULL;
            
$this->reset($instance);

            throw 
$e;
        }

        return 
$this->status self::STATUS_INITIALIZED_FULL;
    }

    public function 
reset($instance): void
    
{
        
$class $instance::class;
        
$propertyScopes Hydrator::$propertyScopes[$class] ??= Hydrator::getPropertyScopes($class);
        
$skippedProperties $this->skippedProperties;
        
$properties = (array) $instance;
        
$onlyProperties is_array($this->initializer) ? $this->initializer null;

        foreach (
$propertyScopes as $key => [$scope$name$readonlyScope]) {
            
$propertyScopes[$k "$scope$name"] ?? $propertyScopes[$k "*$name"] ?? $k $name;

            if (
$k === $key && (null !== $readonlyScope || !array_key_exists($k$properties))) {
                
$skippedProperties[$k] = true;
            }
        }

        foreach (
LazyObjectRegistry::$classResetters[$class] as $reset) {
            
$reset($instance$skippedProperties$onlyProperties);
        }

        
$this->status self::STATUS_INITIALIZED_FULL === $this->status self::STATUS_UNINITIALIZED_FULL self::STATUS_UNINITIALIZED_PARTIAL;
    }
}
Онлайн: 8
Реклама