Verzeichnisstruktur phpBB-3.3.16


Veröffentlicht
27.04.2026

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

MagicSet.php

Zuletzt modifiziert: 01.05.2026, 11:28 - Dateigröße: 4.53 KiB


 001  <?php
 002   
 003  declare(strict_types=1);
 004   
 005  namespace ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator;
 006   
 007  use ProxyManager\Generator\MagicMethodGenerator;
 008  use Zend\Code\Generator\ParameterGenerator;
 009  use ProxyManager\ProxyGenerator\LazyLoadingGhost\PropertyGenerator\PrivatePropertiesMap;
 010  use ProxyManager\ProxyGenerator\LazyLoadingGhost\PropertyGenerator\ProtectedPropertiesMap;
 011  use ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap;
 012  use ProxyManager\ProxyGenerator\Util\PublicScopeSimulator;
 013  use ReflectionClass;
 014  use Zend\Code\Generator\MethodGenerator;
 015  use Zend\Code\Generator\PropertyGenerator;
 016   
 017  /**
 018   * Magic `__set` for lazy loading ghost objects
 019   *
 020   * @author Marco Pivetta <ocramius@gmail.com>
 021   * @license MIT
 022   */
 023  class MagicSet extends MagicMethodGenerator
 024  {
 025      /**
 026       * @var string
 027       */
 028      private $callParentTemplate = <<<'PHP'
 029  %s
 030   
 031  if (isset(self::$%s[$name])) {
 032      return ($this->$name = $value);
 033  }
 034   
 035  if (isset(self::$%s[$name])) {
 036      // check protected property access via compatible class
 037      $callers      = debug_backtrace(\DEBUG_BACKTRACE_PROVIDE_OBJECT, 2);
 038      $caller       = isset($callers[1]) ? $callers[1] : [];
 039      $object       = isset($caller['object']) ? $caller['object'] : '';
 040      $expectedType = self::$%s[$name];
 041   
 042      if ($object instanceof $expectedType) {
 043          return ($this->$name = $value);
 044      }
 045   
 046      $class = isset($caller['class']) ? $caller['class'] : '';
 047   
 048      if ($class === $expectedType || is_subclass_of($class, $expectedType) || $class === 'ReflectionProperty') {
 049          return ($this->$name = $value);
 050      }
 051  } elseif (isset(self::$%s[$name])) {
 052      // check private property access via same class
 053      $callers = debug_backtrace(\DEBUG_BACKTRACE_PROVIDE_OBJECT, 2);
 054      $caller  = isset($callers[1]) ? $callers[1] : [];
 055      $class   = isset($caller['class']) ? $caller['class'] : '';
 056   
 057      static $accessorCache = [];
 058   
 059      if (isset(self::$%s[$name][$class])) {
 060          $cacheKey = $class . '#' . $name;
 061          $accessor = isset($accessorCache[$cacheKey])
 062              ? $accessorCache[$cacheKey]
 063              : $accessorCache[$cacheKey] = \Closure::bind(function ($instance, $value) use ($name) {
 064                  return ($instance->$name = $value);
 065              }, null, $class);
 066   
 067          return $accessor($this, $value);
 068      }
 069   
 070      if ('ReflectionProperty' === $class) {
 071          $tmpClass = key(self::$%s[$name]);
 072          $cacheKey = $tmpClass . '#' . $name;
 073          $accessor = isset($accessorCache[$cacheKey])
 074              ? $accessorCache[$cacheKey]
 075              : $accessorCache[$cacheKey] = \Closure::bind(function ($instance, $value) use ($name) {
 076                  return ($instance->$name = $value);
 077              }, null, $tmpClass);
 078   
 079          return $accessor($this, $value);
 080      }
 081  }
 082   
 083  %s
 084  PHP;
 085   
 086   
 087      /**
 088       * @param ReflectionClass        $originalClass
 089       * @param PropertyGenerator      $initializerProperty
 090       * @param MethodGenerator        $callInitializer
 091       * @param PublicPropertiesMap    $publicProperties
 092       * @param ProtectedPropertiesMap $protectedProperties
 093       * @param PrivatePropertiesMap   $privateProperties
 094       *
 095       * @throws \Zend\Code\Generator\Exception\InvalidArgumentException
 096       * @throws \InvalidArgumentException
 097       */
 098      public function __construct(
 099          ReflectionClass $originalClass,
 100          PropertyGenerator $initializerProperty,
 101          MethodGenerator $callInitializer,
 102          PublicPropertiesMap $publicProperties,
 103          ProtectedPropertiesMap $protectedProperties,
 104          PrivatePropertiesMap $privateProperties
 105      ) {
 106          parent::__construct(
 107              $originalClass,
 108              '__set',
 109              [new ParameterGenerator('name'), new ParameterGenerator('value')]
 110          );
 111   
 112          $override = $originalClass->hasMethod('__set');
 113   
 114          $parentAccess = 'return parent::__set($name, $value);';
 115   
 116          if (! $override) {
 117              $parentAccess = PublicScopeSimulator::getPublicAccessSimulationCode(
 118                  PublicScopeSimulator::OPERATION_SET,
 119                  'name',
 120                  'value'
 121              );
 122          }
 123   
 124          $this->setBody(sprintf(
 125              $this->callParentTemplate,
 126              '$this->' . $initializerProperty->getName() . ' && $this->' . $callInitializer->getName()
 127              . '(\'__set\', array(\'name\' => $name, \'value\' => $value));',
 128              $publicProperties->getName(),
 129              $protectedProperties->getName(),
 130              $protectedProperties->getName(),
 131              $privateProperties->getName(),
 132              $privateProperties->getName(),
 133              $privateProperties->getName(),
 134              $parentAccess
 135          ));
 136      }
 137  }
 138