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

FlattenException.php

Zuletzt modifiziert: 01.05.2026, 11:27 - Dateigröße: 6.93 KiB


 001  <?php
 002   
 003  /*
 004   * This file is part of the Symfony package.
 005   *
 006   * (c) Fabien Potencier <fabien@symfony.com>
 007   *
 008   * For the full copyright and license information, please view the LICENSE
 009   * file that was distributed with this source code.
 010   */
 011   
 012  namespace Symfony\Component\Debug\Exception;
 013   
 014  use Symfony\Component\HttpFoundation\Exception\RequestExceptionInterface;
 015  use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
 016   
 017  /**
 018   * FlattenException wraps a PHP Exception to be able to serialize it.
 019   *
 020   * Basically, this class removes all objects from the trace.
 021   *
 022   * @author Fabien Potencier <fabien@symfony.com>
 023   */
 024  class FlattenException
 025  {
 026      private $message;
 027      private $code;
 028      private $previous;
 029      private $trace;
 030      private $class;
 031      private $statusCode;
 032      private $headers;
 033      private $file;
 034      private $line;
 035   
 036      public static function create(\Exception $exception, $statusCode = null, array $headers = [])
 037      {
 038          $e = new static();
 039          $e->setMessage($exception->getMessage());
 040          $e->setCode($exception->getCode());
 041   
 042          if ($exception instanceof HttpExceptionInterface) {
 043              $statusCode = $exception->getStatusCode();
 044              $headers = array_merge($headers, $exception->getHeaders());
 045          } elseif ($exception instanceof RequestExceptionInterface) {
 046              $statusCode = 400;
 047          }
 048   
 049          if (null === $statusCode) {
 050              $statusCode = 500;
 051          }
 052   
 053          $e->setStatusCode($statusCode);
 054          $e->setHeaders($headers);
 055          $e->setTraceFromException($exception);
 056          $e->setClass(\get_class($exception));
 057          $e->setFile($exception->getFile());
 058          $e->setLine($exception->getLine());
 059   
 060          $previous = $exception->getPrevious();
 061   
 062          if ($previous instanceof \Exception) {
 063              $e->setPrevious(static::create($previous));
 064          } elseif ($previous instanceof \Throwable) {
 065              $e->setPrevious(static::create(new FatalThrowableError($previous)));
 066          }
 067   
 068          return $e;
 069      }
 070   
 071      public function toArray()
 072      {
 073          $exceptions = [];
 074          foreach (array_merge([$this], $this->getAllPrevious()) as $exception) {
 075              $exceptions[] = [
 076                  'message' => $exception->getMessage(),
 077                  'class' => $exception->getClass(),
 078                  'trace' => $exception->getTrace(),
 079              ];
 080          }
 081   
 082          return $exceptions;
 083      }
 084   
 085      public function getStatusCode()
 086      {
 087          return $this->statusCode;
 088      }
 089   
 090      public function setStatusCode($code)
 091      {
 092          $this->statusCode = $code;
 093      }
 094   
 095      public function getHeaders()
 096      {
 097          return $this->headers;
 098      }
 099   
 100      public function setHeaders(array $headers)
 101      {
 102          $this->headers = $headers;
 103      }
 104   
 105      public function getClass()
 106      {
 107          return $this->class;
 108      }
 109   
 110      public function setClass($class)
 111      {
 112          $this->class = $class;
 113      }
 114   
 115      public function getFile()
 116      {
 117          return $this->file;
 118      }
 119   
 120      public function setFile($file)
 121      {
 122          $this->file = $file;
 123      }
 124   
 125      public function getLine()
 126      {
 127          return $this->line;
 128      }
 129   
 130      public function setLine($line)
 131      {
 132          $this->line = $line;
 133      }
 134   
 135      public function getMessage()
 136      {
 137          return $this->message;
 138      }
 139   
 140      public function setMessage($message)
 141      {
 142          $this->message = $message;
 143      }
 144   
 145      public function getCode()
 146      {
 147          return $this->code;
 148      }
 149   
 150      public function setCode($code)
 151      {
 152          $this->code = $code;
 153      }
 154   
 155      public function getPrevious()
 156      {
 157          return $this->previous;
 158      }
 159   
 160      public function setPrevious(self $previous)
 161      {
 162          $this->previous = $previous;
 163      }
 164   
 165      public function getAllPrevious()
 166      {
 167          $exceptions = [];
 168          $e = $this;
 169          while ($e = $e->getPrevious()) {
 170              $exceptions[] = $e;
 171          }
 172   
 173          return $exceptions;
 174      }
 175   
 176      public function getTrace()
 177      {
 178          return $this->trace;
 179      }
 180   
 181      public function setTraceFromException(\Exception $exception)
 182      {
 183          $this->setTrace($exception->getTrace(), $exception->getFile(), $exception->getLine());
 184      }
 185   
 186      public function setTrace($trace, $file, $line)
 187      {
 188          $this->trace = [];
 189          $this->trace[] = [
 190              'namespace' => '',
 191              'short_class' => '',
 192              'class' => '',
 193              'type' => '',
 194              'function' => '',
 195              'file' => $file,
 196              'line' => $line,
 197              'args' => [],
 198          ];
 199          foreach ($trace as $entry) {
 200              $class = '';
 201              $namespace = '';
 202              if (isset($entry['class'])) {
 203                  $parts = explode('\\', $entry['class']);
 204                  $class = array_pop($parts);
 205                  $namespace = implode('\\', $parts);
 206              }
 207   
 208              $this->trace[] = [
 209                  'namespace' => $namespace,
 210                  'short_class' => $class,
 211                  'class' => isset($entry['class']) ? $entry['class'] : '',
 212                  'type' => isset($entry['type']) ? $entry['type'] : '',
 213                  'function' => isset($entry['function']) ? $entry['function'] : null,
 214                  'file' => isset($entry['file']) ? $entry['file'] : null,
 215                  'line' => isset($entry['line']) ? $entry['line'] : null,
 216                  'args' => isset($entry['args']) ? $this->flattenArgs($entry['args']) : [],
 217              ];
 218          }
 219      }
 220   
 221      private function flattenArgs($args, $level = 0, &$count = 0)
 222      {
 223          $result = [];
 224          foreach ($args as $key => $value) {
 225              if (++$count > 1e4) {
 226                  return ['array', '*SKIPPED over 10000 entries*'];
 227              }
 228              if ($value instanceof \__PHP_Incomplete_Class) {
 229                  // is_object() returns false on PHP<=7.1
 230                  $result[$key] = ['incomplete-object', $this->getClassNameFromIncomplete($value)];
 231              } elseif (\is_object($value)) {
 232                  $result[$key] = ['object', \get_class($value)];
 233              } elseif (\is_array($value)) {
 234                  if ($level > 10) {
 235                      $result[$key] = ['array', '*DEEP NESTED ARRAY*'];
 236                  } else {
 237                      $result[$key] = ['array', $this->flattenArgs($value, $level + 1, $count)];
 238                  }
 239              } elseif (null === $value) {
 240                  $result[$key] = ['null', null];
 241              } elseif (\is_bool($value)) {
 242                  $result[$key] = ['boolean', $value];
 243              } elseif (\is_int($value)) {
 244                  $result[$key] = ['integer', $value];
 245              } elseif (\is_float($value)) {
 246                  $result[$key] = ['float', $value];
 247              } elseif (\is_resource($value)) {
 248                  $result[$key] = ['resource', get_resource_type($value)];
 249              } else {
 250                  $result[$key] = ['string', (string) $value];
 251              }
 252          }
 253   
 254          return $result;
 255      }
 256   
 257      private function getClassNameFromIncomplete(\__PHP_Incomplete_Class $value)
 258      {
 259          $array = new \ArrayObject($value);
 260   
 261          return $array['__PHP_Incomplete_Class_Name'];
 262      }
 263  }
 264