Verzeichnisstruktur phpBB-3.3.15


Veröffentlicht
28.08.2024

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

LazyLoadingValueHolderGenerator.php

Zuletzt modifiziert: 02.04.2025, 15:04 - Dateigröße: 5.47 KiB


001  <?php
002   
003  declare(strict_types=1);
004   
005  namespace ProxyManager\ProxyGenerator;
006   
007  use ProxyManager\Exception\InvalidProxiedClassException;
008  use ProxyManager\Generator\Util\ClassGeneratorUtils;
009  use ProxyManager\Proxy\VirtualProxyInterface;
010  use ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator\MagicWakeup;
011  use ProxyManager\ProxyGenerator\Assertion\CanProxyAssertion;
012  use ProxyManager\ProxyGenerator\LazyLoading\MethodGenerator\StaticProxyConstructor;
013  use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\GetProxyInitializer;
014  use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\InitializeProxy;
015  use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\IsProxyInitialized;
016  use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\LazyLoadingMethodInterceptor;
017  use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicClone;
018  use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicGet;
019  use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicIsset;
020  use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicSet;
021  use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicSleep;
022  use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicUnset;
023  use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\SetProxyInitializer;
024  use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\PropertyGenerator\InitializerProperty;
025  use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\PropertyGenerator\ValueHolderProperty;
026  use ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap;
027  use ProxyManager\ProxyGenerator\Util\Properties;
028  use ProxyManager\ProxyGenerator\Util\ProxiedMethodsFilter;
029  use ProxyManager\ProxyGenerator\ValueHolder\MethodGenerator\Constructor;
030  use ProxyManager\ProxyGenerator\ValueHolder\MethodGenerator\GetWrappedValueHolderValue;
031  use ReflectionClass;
032  use ReflectionMethod;
033  use Zend\Code\Generator\ClassGenerator;
034  use Zend\Code\Generator\MethodGenerator;
035  use Zend\Code\Reflection\MethodReflection;
036   
037  /**
038   * Generator for proxies implementing {@see \ProxyManager\Proxy\VirtualProxyInterface}
039   *
040   * {@inheritDoc}
041   *
042   * @author Marco Pivetta <ocramius@gmail.com>
043   * @license MIT
044   */
045  class LazyLoadingValueHolderGenerator implements ProxyGeneratorInterface
046  {
047      /**
048       * {@inheritDoc}
049       *
050       * @throws InvalidProxiedClassException
051       * @throws \Zend\Code\Generator\Exception\InvalidArgumentException
052       * @throws \InvalidArgumentException
053       */
054      public function generate(ReflectionClass $originalClass, ClassGenerator $classGenerator)
055      {
056          CanProxyAssertion::assertClassCanBeProxied($originalClass);
057   
058          $interfaces          = [VirtualProxyInterface::class];
059          $publicProperties    = new PublicPropertiesMap(Properties::fromReflectionClass($originalClass));
060   
061          if ($originalClass->isInterface()) {
062              $interfaces[] = $originalClass->getName();
063          } else {
064              $classGenerator->setExtendedClass($originalClass->getName());
065          }
066   
067          $classGenerator->setImplementedInterfaces($interfaces);
068          $classGenerator->addPropertyFromGenerator($valueHolder = new ValueHolderProperty());
069          $classGenerator->addPropertyFromGenerator($initializer = new InitializerProperty());
070          $classGenerator->addPropertyFromGenerator($publicProperties);
071   
072          array_map(
073              function (MethodGenerator $generatedMethod) use ($originalClass, $classGenerator) {
074                  ClassGeneratorUtils::addMethodIfNotFinal($originalClass, $classGenerator, $generatedMethod);
075              },
076              array_merge(
077                  array_map(
078                      $this->buildLazyLoadingMethodInterceptor($initializer, $valueHolder),
079                      ProxiedMethodsFilter::getProxiedMethods($originalClass)
080                  ),
081                  [
082                      new StaticProxyConstructor($initializer, Properties::fromReflectionClass($originalClass)),
083                      Constructor::generateMethod($originalClass, $valueHolder),
084                      new MagicGet($originalClass, $initializer, $valueHolder, $publicProperties),
085                      new MagicSet($originalClass, $initializer, $valueHolder, $publicProperties),
086                      new MagicIsset($originalClass, $initializer, $valueHolder, $publicProperties),
087                      new MagicUnset($originalClass, $initializer, $valueHolder, $publicProperties),
088                      new MagicClone($originalClass, $initializer, $valueHolder),
089                      new MagicSleep($originalClass, $initializer, $valueHolder),
090                      new MagicWakeup($originalClass),
091                      new SetProxyInitializer($initializer),
092                      new GetProxyInitializer($initializer),
093                      new InitializeProxy($initializer, $valueHolder),
094                      new IsProxyInitialized($valueHolder),
095                      new GetWrappedValueHolderValue($valueHolder),
096                  ]
097              )
098          );
099      }
100   
101      private function buildLazyLoadingMethodInterceptor(
102          InitializerProperty $initializer,
103          ValueHolderProperty $valueHolder
104      ) : callable {
105          return function (ReflectionMethod $method) use ($initializer, $valueHolder) : LazyLoadingMethodInterceptor {
106              return LazyLoadingMethodInterceptor::generateMethod(
107                  new MethodReflection($method->getDeclaringClass()->getName(), $method->getName()),
108                  $initializer,
109                  $valueHolder
110              );
111          };
112      }
113  }
114