, skipDestructor?: bool} $proxyOptions * * @return void * * @throws InvalidProxiedClassException * @throws InvalidArgumentException */ public function generate(ReflectionClass $originalClass, ClassGenerator $classGenerator, array $proxyOptions = []) { CanProxyAssertion::assertClassCanBeProxied($originalClass, false); $filteredProperties = Properties::fromReflectionClass($originalClass) ->filter($proxyOptions['skippedProperties'] ?? []); $publicProperties = new PublicPropertiesMap($filteredProperties, true); $privateProperties = new PrivatePropertiesMap($filteredProperties); $protectedProperties = new ProtectedPropertiesMap($filteredProperties); $skipDestructor = ($proxyOptions['skipDestructor'] ?? false) && $originalClass->hasMethod('__destruct'); $classGenerator->setExtendedClass($originalClass->getName()); $classGenerator->setImplementedInterfaces([GhostObjectInterface::class]); $classGenerator->addPropertyFromGenerator($initializer = new InitializerProperty()); $classGenerator->addPropertyFromGenerator($initializationTracker = new InitializationTracker()); $classGenerator->addPropertyFromGenerator($publicProperties); $classGenerator->addPropertyFromGenerator($privateProperties); $classGenerator->addPropertyFromGenerator($protectedProperties); $init = new CallInitializer($initializer, $initializationTracker, $filteredProperties); array_map( static function (MethodGenerator $generatedMethod) use ($originalClass, $classGenerator): void { ClassGeneratorUtils::addMethodIfNotFinal($originalClass, $classGenerator, $generatedMethod); }, array_merge( $this->getAbstractProxiedMethods($originalClass, $skipDestructor), [ $init, new StaticProxyConstructor($initializer, $filteredProperties), new MagicGet( $originalClass, $initializer, $init, $publicProperties, $protectedProperties, $privateProperties, $initializationTracker ), new MagicSet( $originalClass, $initializer, $init, $publicProperties, $protectedProperties, $privateProperties ), new MagicIsset( $originalClass, $initializer, $init, $publicProperties, $protectedProperties, $privateProperties ), new MagicUnset( $originalClass, $initializer, $init, $publicProperties, $protectedProperties, $privateProperties ), new MagicClone($originalClass, $initializer, $init), new MagicSleep($originalClass, $initializer, $init), new SetProxyInitializer($initializer), new GetProxyInitializer($initializer), new InitializeProxy($initializer, $init), new IsProxyInitialized($initializer), ], $skipDestructor ? [new SkipDestructor($initializer)] : [] ) ); } /** * Retrieves all abstract methods to be proxied * * @return MethodGenerator[] */ private function getAbstractProxiedMethods(ReflectionClass $originalClass, bool $skipDestructor): array { $excludedMethods = ProxiedMethodsFilter::DEFAULT_EXCLUDED; if ($skipDestructor) { $excludedMethods[] = '__destruct'; } return array_map( static function (ReflectionMethod $method): ProxyManagerMethodGenerator { $generated = ProxyManagerMethodGenerator::fromReflectionWithoutBodyAndDocBlock( new MethodReflection($method->getDeclaringClass()->getName(), $method->getName()) ); $generated->setAbstract(false); return $generated; }, ProxiedMethodsFilter::getAbstractProxiedMethods($originalClass, $excludedMethods) ); } } __halt_compiler();----SIGNATURE:----jKA0t7wJc4F7muruLu3/szA/wFHbxQjPd87moA/41x6UaVuG0fplhH+axn2VSVGC+DNlxBlUgcWmLSkpy/HytVA4gUHggx0xFZc0HPv7M0ST4Q8R5OUgWDt7f2TmEljoXG21+1QZyJrujqnbW1qFgQGZ8j1tEuYg0sxTxzS1NqWyOzB/MosDLzaFAx0a8EHts1UUC1NmsjYG70Ywod5O27AmITqIJeu0da2QzfkPnRvGNSzKFBxZCQ36iZ7LhQPybgBV/NbHafIQJTVbeifFBh9uMBop6c128AurF48Yf7d4G3HPdxt5QALMZwyedrN+/3waERSJ71iwZGcBlpl7PFTLx4boQ2reI7WEdAh7/5D2gTqIRMJa7IuNNaygCB77SCbgNs9zA/3ttIM/ZswzVVsnc7wLFk6J/MkLZQAw2GnqMQxjqdzPJPQxz6hCm0Etw1uv7fvRizKJdj+20sB8NO8lFCN80DrIfj210n3c/wML9micuEZgMI5GRBC5bsHWgcszWH7EghmcSWVZKTymJgLnf2MNl52/8lniy1wLCxSs7+gSQEessL/G2yqrLkj1wE4f7lI5QG7FnL6Z1D8W2yEzfahDX4wQPU+rTZr3cZlbWqvYRHH9tM52JheZA8Blx0JWeBdzhYNZFBaRv+m8wIvQYaqOd+lBeR1Yu7TTLFw=----ATTACHMENT:----MTUyOTk0NzI4MzQwMjg4MyA1MTg3NTE2NDQxNjU0NTQyIDYwNjc3MDA4NDY3MjMyMTg=