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

ClassLoader.php

Zuletzt modifiziert: 09.10.2024, 12:52 - Dateigröße: 12.17 KiB


 001  <?php
 002   
 003  /*
 004   * This file is part of Composer.
 005   *
 006   * (c) Nils Adermann <naderman@naderman.de>
 007   *     Jordi Boggiano <j.boggiano@seld.be>
 008   *
 009   * For the full copyright and license information, please view the LICENSE
 010   * file that was distributed with this source code.
 011   */
 012   
 013  namespace Composer\Autoload;
 014   
 015  /**
 016   * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
 017   *
 018   *     $loader = new \Composer\Autoload\ClassLoader();
 019   *
 020   *     // register classes with namespaces
 021   *     $loader->add('Symfony\Component', __DIR__.'/component');
 022   *     $loader->add('Symfony',           __DIR__.'/framework');
 023   *
 024   *     // activate the autoloader
 025   *     $loader->register();
 026   *
 027   *     // to enable searching the include path (eg. for PEAR packages)
 028   *     $loader->setUseIncludePath(true);
 029   *
 030   * In this example, if you try to use a class in the Symfony\Component
 031   * namespace or one of its children (Symfony\Component\Console for instance),
 032   * the autoloader will first look for the class under the component/
 033   * directory, and it will then fallback to the framework/ directory if not
 034   * found before giving up.
 035   *
 036   * This class is loosely based on the Symfony UniversalClassLoader.
 037   *
 038   * @author Fabien Potencier <fabien@symfony.com>
 039   * @author Jordi Boggiano <j.boggiano@seld.be>
 040   * @see    http://www.php-fig.org/psr/psr-0/
 041   * @see    http://www.php-fig.org/psr/psr-4/
 042   */
 043  class ClassLoader
 044  {
 045      // PSR-4
 046      private $prefixLengthsPsr4 = array();
 047      private $prefixDirsPsr4 = array();
 048      private $fallbackDirsPsr4 = array();
 049   
 050      // PSR-0
 051      private $prefixesPsr0 = array();
 052      private $fallbackDirsPsr0 = array();
 053   
 054      private $useIncludePath = false;
 055      private $classMap = array();
 056   
 057      private $classMapAuthoritative = false;
 058   
 059      public function getPrefixes()
 060      {
 061          if (!empty($this->prefixesPsr0)) {
 062              return call_user_func_array('array_merge', $this->prefixesPsr0);
 063          }
 064   
 065          return array();
 066      }
 067   
 068      public function getPrefixesPsr4()
 069      {
 070          return $this->prefixDirsPsr4;
 071      }
 072   
 073      public function getFallbackDirs()
 074      {
 075          return $this->fallbackDirsPsr0;
 076      }
 077   
 078      public function getFallbackDirsPsr4()
 079      {
 080          return $this->fallbackDirsPsr4;
 081      }
 082   
 083      public function getClassMap()
 084      {
 085          return $this->classMap;
 086      }
 087   
 088      /**
 089       * @param array $classMap Class to filename map
 090       */
 091      public function addClassMap(array $classMap)
 092      {
 093          if ($this->classMap) {
 094              $this->classMap = array_merge($this->classMap, $classMap);
 095          } else {
 096              $this->classMap = $classMap;
 097          }
 098      }
 099   
 100      /**
 101       * Registers a set of PSR-0 directories for a given prefix, either
 102       * appending or prepending to the ones previously set for this prefix.
 103       *
 104       * @param string       $prefix  The prefix
 105       * @param array|string $paths   The PSR-0 root directories
 106       * @param bool         $prepend Whether to prepend the directories
 107       */
 108      public function add($prefix, $paths, $prepend = false)
 109      {
 110          if (!$prefix) {
 111              if ($prepend) {
 112                  $this->fallbackDirsPsr0 = array_merge(
 113                      (array) $paths,
 114                      $this->fallbackDirsPsr0
 115                  );
 116              } else {
 117                  $this->fallbackDirsPsr0 = array_merge(
 118                      $this->fallbackDirsPsr0,
 119                      (array) $paths
 120                  );
 121              }
 122   
 123              return;
 124          }
 125   
 126          $first = $prefix[0];
 127          if (!isset($this->prefixesPsr0[$first][$prefix])) {
 128              $this->prefixesPsr0[$first][$prefix] = (array) $paths;
 129   
 130              return;
 131          }
 132          if ($prepend) {
 133              $this->prefixesPsr0[$first][$prefix] = array_merge(
 134                  (array) $paths,
 135                  $this->prefixesPsr0[$first][$prefix]
 136              );
 137          } else {
 138              $this->prefixesPsr0[$first][$prefix] = array_merge(
 139                  $this->prefixesPsr0[$first][$prefix],
 140                  (array) $paths
 141              );
 142          }
 143      }
 144   
 145      /**
 146       * Registers a set of PSR-4 directories for a given namespace, either
 147       * appending or prepending to the ones previously set for this namespace.
 148       *
 149       * @param string       $prefix  The prefix/namespace, with trailing '\\'
 150       * @param array|string $paths   The PSR-4 base directories
 151       * @param bool         $prepend Whether to prepend the directories
 152       *
 153       * @throws \InvalidArgumentException
 154       */
 155      public function addPsr4($prefix, $paths, $prepend = false)
 156      {
 157          if (!$prefix) {
 158              // Register directories for the root namespace.
 159              if ($prepend) {
 160                  $this->fallbackDirsPsr4 = array_merge(
 161                      (array) $paths,
 162                      $this->fallbackDirsPsr4
 163                  );
 164              } else {
 165                  $this->fallbackDirsPsr4 = array_merge(
 166                      $this->fallbackDirsPsr4,
 167                      (array) $paths
 168                  );
 169              }
 170          } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
 171              // Register directories for a new namespace.
 172              $length = strlen($prefix);
 173              if ('\\' !== $prefix[$length - 1]) {
 174                  throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
 175              }
 176              $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
 177              $this->prefixDirsPsr4[$prefix] = (array) $paths;
 178          } elseif ($prepend) {
 179              // Prepend directories for an already registered namespace.
 180              $this->prefixDirsPsr4[$prefix] = array_merge(
 181                  (array) $paths,
 182                  $this->prefixDirsPsr4[$prefix]
 183              );
 184          } else {
 185              // Append directories for an already registered namespace.
 186              $this->prefixDirsPsr4[$prefix] = array_merge(
 187                  $this->prefixDirsPsr4[$prefix],
 188                  (array) $paths
 189              );
 190          }
 191      }
 192   
 193      /**
 194       * Registers a set of PSR-0 directories for a given prefix,
 195       * replacing any others previously set for this prefix.
 196       *
 197       * @param string       $prefix The prefix
 198       * @param array|string $paths  The PSR-0 base directories
 199       */
 200      public function set($prefix, $paths)
 201      {
 202          if (!$prefix) {
 203              $this->fallbackDirsPsr0 = (array) $paths;
 204          } else {
 205              $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
 206          }
 207      }
 208   
 209      /**
 210       * Registers a set of PSR-4 directories for a given namespace,
 211       * replacing any others previously set for this namespace.
 212       *
 213       * @param string       $prefix The prefix/namespace, with trailing '\\'
 214       * @param array|string $paths  The PSR-4 base directories
 215       *
 216       * @throws \InvalidArgumentException
 217       */
 218      public function setPsr4($prefix, $paths)
 219      {
 220          if (!$prefix) {
 221              $this->fallbackDirsPsr4 = (array) $paths;
 222          } else {
 223              $length = strlen($prefix);
 224              if ('\\' !== $prefix[$length - 1]) {
 225                  throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
 226              }
 227              $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
 228              $this->prefixDirsPsr4[$prefix] = (array) $paths;
 229          }
 230      }
 231   
 232      /**
 233       * Turns on searching the include path for class files.
 234       *
 235       * @param bool $useIncludePath
 236       */
 237      public function setUseIncludePath($useIncludePath)
 238      {
 239          $this->useIncludePath = $useIncludePath;
 240      }
 241   
 242      /**
 243       * Can be used to check if the autoloader uses the include path to check
 244       * for classes.
 245       *
 246       * @return bool
 247       */
 248      public function getUseIncludePath()
 249      {
 250          return $this->useIncludePath;
 251      }
 252   
 253      /**
 254       * Turns off searching the prefix and fallback directories for classes
 255       * that have not been registered with the class map.
 256       *
 257       * @param bool $classMapAuthoritative
 258       */
 259      public function setClassMapAuthoritative($classMapAuthoritative)
 260      {
 261          $this->classMapAuthoritative = $classMapAuthoritative;
 262      }
 263   
 264      /**
 265       * Should class lookup fail if not found in the current class map?
 266       *
 267       * @return bool
 268       */
 269      public function isClassMapAuthoritative()
 270      {
 271          return $this->classMapAuthoritative;
 272      }
 273   
 274      /**
 275       * Registers this instance as an autoloader.
 276       *
 277       * @param bool $prepend Whether to prepend the autoloader or not
 278       */
 279      public function register($prepend = false)
 280      {
 281          spl_autoload_register(array($this, 'loadClass'), true, $prepend);
 282      }
 283   
 284      /**
 285       * Unregisters this instance as an autoloader.
 286       */
 287      public function unregister()
 288      {
 289          spl_autoload_unregister(array($this, 'loadClass'));
 290      }
 291   
 292      /**
 293       * Loads the given class or interface.
 294       *
 295       * @param  string    $class The name of the class
 296       * @return bool|null True if loaded, null otherwise
 297       */
 298      public function loadClass($class)
 299      {
 300          if ($file = $this->findFile($class)) {
 301              includeFile($file);
 302   
 303              return true;
 304          }
 305      }
 306   
 307      /**
 308       * Finds the path to the file where the class is defined.
 309       *
 310       * @param string $class The name of the class
 311       *
 312       * @return string|false The path if found, false otherwise
 313       */
 314      public function findFile($class)
 315      {
 316          // work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731
 317          if ('\\' == $class[0]) {
 318              $class = substr($class, 1);
 319          }
 320   
 321          // class map lookup
 322          if (isset($this->classMap[$class])) {
 323              return $this->classMap[$class];
 324          }
 325          if ($this->classMapAuthoritative) {
 326              return false;
 327          }
 328   
 329          $file = $this->findFileWithExtension($class, '.php');
 330   
 331          // Search for Hack files if we are running on HHVM
 332          if ($file === null && defined('HHVM_VERSION')) {
 333              $file = $this->findFileWithExtension($class, '.hh');
 334          }
 335   
 336          if ($file === null) {
 337              // Remember that this class does not exist.
 338              return $this->classMap[$class] = false;
 339          }
 340   
 341          return $file;
 342      }
 343   
 344      private function findFileWithExtension($class, $ext)
 345      {
 346          // PSR-4 lookup
 347          $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
 348   
 349          $first = $class[0];
 350          if (isset($this->prefixLengthsPsr4[$first])) {
 351              foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) {
 352                  if (0 === strpos($class, $prefix)) {
 353                      foreach ($this->prefixDirsPsr4[$prefix] as $dir) {
 354                          if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
 355                              return $file;
 356                          }
 357                      }
 358                  }
 359              }
 360          }
 361   
 362          // PSR-4 fallback dirs
 363          foreach ($this->fallbackDirsPsr4 as $dir) {
 364              if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
 365                  return $file;
 366              }
 367          }
 368   
 369          // PSR-0 lookup
 370          if (false !== $pos = strrpos($class, '\\')) {
 371              // namespaced class name
 372              $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
 373                  . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
 374          } else {
 375              // PEAR-like class name
 376              $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
 377          }
 378   
 379          if (isset($this->prefixesPsr0[$first])) {
 380              foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
 381                  if (0 === strpos($class, $prefix)) {
 382                      foreach ($dirs as $dir) {
 383                          if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
 384                              return $file;
 385                          }
 386                      }
 387                  }
 388              }
 389          }
 390   
 391          // PSR-0 fallback dirs
 392          foreach ($this->fallbackDirsPsr0 as $dir) {
 393              if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
 394                  return $file;
 395              }
 396          }
 397   
 398          // PSR-0 include paths.
 399          if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
 400              return $file;
 401          }
 402      }
 403  }
 404   
 405  /**
 406   * Scope isolated include.
 407   *
 408   * Prevents access to $this/self from included files.
 409   */
 410  function includeFile($file)
 411  {
 412      include $file;
 413  }
 414