Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

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

TraitUsageGenerator.php

Zuletzt modifiziert: 09.10.2024, 12:57 - Dateigröße: 10.14 KiB


 001  <?php
 002  /**
 003   * Zend Framework (http://framework.zend.com/)
 004   *
 005   * @link      http://github.com/zendframework/zf2 for the canonical source repository
 006   * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
 007   * @license   http://framework.zend.com/license/new-bsd New BSD License
 008   */
 009  namespace Zend\Code\Generator;
 010   
 011  use Reflection;
 012  use ReflectionMethod;
 013   
 014  class TraitUsageGenerator extends AbstractGenerator
 015  {
 016      /**
 017       * @var ClassGenerator
 018       */
 019      protected $classGenerator;
 020   
 021      /**
 022       * @var array Array of trait names
 023       */
 024      protected $traits = array();
 025   
 026      /**
 027       * @var array Array of trait aliases
 028       */
 029      protected $traitAliases = array();
 030   
 031      /**
 032       * @var array Array of trait overrides
 033       */
 034      protected $traitOverrides = array();
 035   
 036      /**
 037       * @var array Array of string names
 038       */
 039      protected $uses = array();
 040   
 041      public function __construct(ClassGenerator $classGenerator)
 042      {
 043          $this->classGenerator = $classGenerator;
 044      }
 045   
 046      /**
 047       * @inherit Zend\Code\Generator\TraitUsageInterface
 048       */
 049      public function addUse($use, $useAlias = null)
 050      {
 051          if (! empty($useAlias)) {
 052              $use .= ' as ' . $useAlias;
 053          }
 054   
 055          $this->uses[$use] = $use;
 056          return $this;
 057      }
 058   
 059      /**
 060       * @inherit Zend\Code\Generator\TraitUsageInterface
 061       */
 062      public function getUses()
 063      {
 064          return array_values($this->uses);
 065      }
 066   
 067      /**
 068       * @inherit Zend\Code\Generator\TraitUsageInterface
 069       */
 070      public function addTrait($trait)
 071      {
 072          $traitName = $trait;
 073          if (is_array($trait)) {
 074              if (! array_key_exists('traitName', $trait)) {
 075                  throw new Exception\InvalidArgumentException('Missing required value for traitName');
 076              }
 077              $traitName = $trait['traitName'];
 078   
 079              if (array_key_exists('aliases', $trait)) {
 080                  foreach ($trait['aliases'] as $alias) {
 081                      $this->addAlias($alias);
 082                  }
 083              }
 084   
 085              if (array_key_exists('insteadof', $trait)) {
 086                  foreach ($trait['insteadof'] as $insteadof) {
 087                      $this->addTraitOverride($insteadof);
 088                  }
 089              }
 090          }
 091   
 092          if (! $this->hasTrait($traitName)) {
 093              $this->traits[] = $traitName;
 094          }
 095   
 096          return $this;
 097      }
 098   
 099      /**
 100       * @inherit Zend\Code\Generator\TraitUsageInterface
 101       */
 102      public function addTraits(array $traits)
 103      {
 104          foreach ($traits as $trait) {
 105              $this->addTrait($trait);
 106          }
 107   
 108          return $this;
 109      }
 110   
 111      /**
 112       * @inherit Zend\Code\Generator\TraitUsageInterface
 113       */
 114      public function hasTrait($traitName)
 115      {
 116          return in_array($traitName, $this->traits);
 117      }
 118   
 119      /**
 120       * @inherit Zend\Code\Generator\TraitUsageInterface
 121       */
 122      public function getTraits()
 123      {
 124          return $this->traits;
 125      }
 126   
 127      /**
 128       * @inherit Zend\Code\Generator\TraitUsageInterface
 129       */
 130      public function removeTrait($traitName)
 131      {
 132          $key = array_search($traitName, $this->traits);
 133          if (false !== $key) {
 134              unset($this->traits[$key]);
 135          }
 136   
 137          return $this;
 138      }
 139   
 140      /**
 141       * @inherit Zend\Code\Generator\TraitUsageInterface
 142       */
 143      public function addTraitAlias($method, $alias, $visibility = null)
 144      {
 145          $traitAndMethod = $method;
 146          if (is_array($method)) {
 147              if (! array_key_exists('traitName', $method)) {
 148                  throw new Exception\InvalidArgumentException('Missing required argument "traitName" for $method');
 149              }
 150   
 151              if (! array_key_exists('method', $method)) {
 152                  throw new Exception\InvalidArgumentException('Missing required argument "method" for $method');
 153              }
 154   
 155              $traitAndMethod = $method['traitName'] . '::' . $method['method'];
 156          }
 157   
 158          // Validations
 159          if (false === strpos($traitAndMethod, "::")) {
 160              throw new Exception\InvalidArgumentException(
 161                  'Invalid Format: $method must be in the format of trait::method'
 162              );
 163          }
 164          if (! is_string($alias)) {
 165              throw new Exception\InvalidArgumentException('Invalid Alias: $alias must be a string or array.');
 166          }
 167          if ($this->classGenerator->hasMethod($alias)) {
 168              throw new Exception\InvalidArgumentException('Invalid Alias: Method name already exists on this class.');
 169          }
 170          if (null !== $visibility
 171              && $visibility !== ReflectionMethod::IS_PUBLIC
 172              && $visibility !== ReflectionMethod::IS_PRIVATE
 173              && $visibility !== ReflectionMethod::IS_PROTECTED
 174          ) {
 175              throw new Exception\InvalidArgumentException(
 176                  'Invalid Type: $visibility must of ReflectionMethod::IS_PUBLIC,'
 177                  . ' ReflectionMethod::IS_PRIVATE or ReflectionMethod::IS_PROTECTED'
 178              );
 179          }
 180   
 181          list($trait, $method) = explode('::', $traitAndMethod);
 182          if (! $this->hasTrait($trait)) {
 183              throw new Exception\InvalidArgumentException('Invalid trait: Trait does not exists on this class');
 184          }
 185   
 186          $this->traitAliases[$traitAndMethod] = array(
 187              'alias'      => $alias,
 188              'visibility' => $visibility
 189          );
 190   
 191          return $this;
 192      }
 193   
 194      /**
 195       * @inherit Zend\Code\Generator\TraitUsageInterface
 196       */
 197      public function getTraitAliases()
 198      {
 199          return $this->traitAliases;
 200      }
 201   
 202      /**
 203       * @inherit Zend\Code\Generator\TraitUsageInterface
 204       */
 205      public function addTraitOverride($method, $traitsToReplace)
 206      {
 207          if (false === is_array($traitsToReplace)) {
 208              $traitsToReplace = array($traitsToReplace);
 209          }
 210   
 211          $traitAndMethod = $method;
 212          if (is_array($method)) {
 213              if (! array_key_exists('traitName', $method)) {
 214                  throw new Exception\InvalidArgumentException('Missing required argument "traitName" for $method');
 215              }
 216   
 217              if (! array_key_exists('method', $method)) {
 218                  throw new Exception\InvalidArgumentException('Missing required argument "method" for $method');
 219              }
 220   
 221              $traitAndMethod = (string) $method['traitName'] . '::' . (string) $method['method'];
 222          }
 223   
 224          // Validations
 225          if (false === strpos($traitAndMethod, "::")) {
 226              throw new Exception\InvalidArgumentException(
 227                  'Invalid Format: $method must be in the format of trait::method'
 228              );
 229          }
 230   
 231          list($trait, $method) = explode("::", $traitAndMethod);
 232          if (! $this->hasTrait($trait)) {
 233              throw new Exception\InvalidArgumentException('Invalid trait: Trait does not exists on this class');
 234          }
 235   
 236          if (! array_key_exists($traitAndMethod, $this->traitOverrides)) {
 237              $this->traitOverrides[$traitAndMethod] = array();
 238          }
 239   
 240          foreach ($traitsToReplace as $traitToReplace) {
 241              if (! is_string($traitToReplace)) {
 242                  throw new Exception\InvalidArgumentException(
 243                      'Invalid Argument: $traitToReplace must be a string or array of strings'
 244                  );
 245              }
 246   
 247              if (! in_array($traitToReplace, $this->traitOverrides[$traitAndMethod])) {
 248                  $this->traitOverrides[$traitAndMethod][] = $traitToReplace;
 249              }
 250          }
 251   
 252          return $this;
 253      }
 254   
 255      /**
 256       * @inherit Zend\Code\Generator\TraitUsageInterface
 257       */
 258      public function removeTraitOverride($method, $overridesToRemove = null)
 259      {
 260          if (! array_key_exists($method, $this->traitOverrides)) {
 261              return $this;
 262          }
 263   
 264          if (null === $overridesToRemove) {
 265              unset($this->traitOverrides[$method]);
 266              return $this;
 267          }
 268   
 269          $overridesToRemove = (! is_array($overridesToRemove))
 270              ? array($overridesToRemove)
 271              : $overridesToRemove;
 272          foreach ($overridesToRemove as $traitToRemove) {
 273              $key = array_search($traitToRemove, $this->traitOverrides[$method]);
 274              if (false !== $key) {
 275                  unset($this->traitOverrides[$method][$key]);
 276              }
 277          }
 278          return $this;
 279      }
 280   
 281      /**
 282       * @inherit Zend\Code\Generator\TraitUsageInterface
 283       */
 284      public function getTraitOverrides()
 285      {
 286          return $this->traitOverrides;
 287      }
 288   
 289      /**
 290       * @inherit Zend\Code\Generator\GeneratorInterface
 291       */
 292      public function generate()
 293      {
 294          $output = '';
 295          $indent = $this->getIndentation();
 296          $traits = $this->getTraits();
 297   
 298          if (empty($traits)) {
 299              return $output;
 300          }
 301   
 302          $output .= $indent . 'use ' . implode(', ', $traits);
 303   
 304          $aliases   = $this->getTraitAliases();
 305          $overrides = $this->getTraitOverrides();
 306          if (empty($aliases) && empty($overrides)) {
 307              $output .= ";" . self::LINE_FEED . self::LINE_FEED;
 308              return $output;
 309          }
 310   
 311          $output .= ' {' . self::LINE_FEED;
 312          foreach ($aliases as $method => $alias) {
 313              $visibility = (null !== $alias['visibility'])
 314                  ? current(Reflection::getModifierNames($alias['visibility'])) . ' '
 315                  : '';
 316   
 317              // validation check
 318              if ($this->classGenerator->hasMethod($alias['alias'])) {
 319                  throw new Exception\RuntimeException(sprintf(
 320                      'Generation Error: Aliased method %s already exists on this class',
 321                      $alias['alias']
 322                  ));
 323              }
 324   
 325              $output .=
 326                  $indent
 327                  . $indent
 328                  . $method
 329                  . ' as '
 330                  . $visibility
 331                  . $alias['alias']
 332                  . ';'
 333                  . self::LINE_FEED;
 334          }
 335   
 336          foreach ($overrides as $method => $insteadofTraits) {
 337              foreach ($insteadofTraits as $insteadofTrait) {
 338                  $output .=
 339                      $indent
 340                      . $indent
 341                      . $method
 342                      . ' insteadof '
 343                      . $insteadofTrait
 344                      . ';'
 345                      . self::LINE_FEED;
 346              }
 347          }
 348   
 349          $output .= self::LINE_FEED . $indent . '}' . self::LINE_FEED . self::LINE_FEED;
 350   
 351          return $output;
 352      }
 353  }
 354