TYPO3 CMS  TYPO3_8-7
DebuggerUtility.php
Go to the documentation of this file.
1 <?php
3 
4 /* *
5  * This script belongs to the Extbase framework *
6  * *
7  * It is free software; you can redistribute it and/or modify it under *
8  * the terms of the GNU Lesser General Public License as published by the *
9  * Free Software Foundation, either version 3 of the License, or (at your *
10  * option) any later version. *
11  * *
12  * This script is distributed in the hope that it will be useful, but *
13  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN- *
14  * TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser *
15  * General Public License for more details. *
16  * *
17  * You should have received a copy of the GNU Lesser General Public *
18  * License along with the script. *
19  * If not, see http://www.gnu.org/licenses/lgpl.html *
20  * *
21  * The TYPO3 project - inspiring people to share! *
22  * */
34 {
35  const PLAINTEXT_INDENT = ' ';
36  const HTML_INDENT = '&nbsp;&nbsp;&nbsp;';
37 
41  protected static $renderedObjects;
42 
48  protected static $blacklistedClassNames = [
49  'PHPUnit_Framework_MockObject_InvocationMocker',
50  \TYPO3\CMS\Extbase\Reflection\ReflectionService::class,
51  \TYPO3\CMS\Extbase\Object\ObjectManager::class,
52  \TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapper::class,
53  \TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager::class,
54  \TYPO3\CMS\Extbase\Persistence\Generic\Qom\QueryObjectModelFactory::class,
55  \TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer::class
56  ];
57 
63  protected static $blacklistedPropertyNames = ['warning'];
64 
70  protected static $stylesheetEchoed = false;
71 
77  protected static $maxDepth = 8;
78 
82  protected static function clearState()
83  {
84  self::$renderedObjects = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
85  }
86 
96  protected static function renderDump($value, $level, $plainText, $ansiColors)
97  {
98  $dump = '';
99  if (is_string($value)) {
100  $croppedValue = strlen($value) > 2000 ? substr($value, 0, 2000) . '...' : $value;
101  if ($plainText) {
102  $dump = self::ansiEscapeWrap(('"' . implode((PHP_EOL . str_repeat(self::PLAINTEXT_INDENT, ($level + 1))), str_split($croppedValue, 76)) . '"'), '33', $ansiColors) . ' (' . strlen($value) . ' chars)';
103  } else {
104  $lines = str_split($croppedValue, 76);
105  $lines = array_map('htmlspecialchars', $lines);
106  $dump = sprintf('\'<span class="extbase-debug-string">%s</span>\' (%s chars)', implode('<br />' . str_repeat(self::HTML_INDENT, $level + 1), $lines), strlen($value));
107  }
108  } elseif (is_numeric($value)) {
109  $dump = sprintf('%s (%s)', self::ansiEscapeWrap($value, '35', $ansiColors), gettype($value));
110  } elseif (is_bool($value)) {
111  $dump = $value ? self::ansiEscapeWrap('TRUE', '32', $ansiColors) : self::ansiEscapeWrap('FALSE', '32', $ansiColors);
112  } elseif (is_null($value) || is_resource($value)) {
113  $dump = gettype($value);
114  } elseif (is_array($value)) {
115  $dump = self::renderArray($value, $level + 1, $plainText, $ansiColors);
116  } elseif (is_object($value)) {
117  if ($value instanceof \Closure) {
118  $dump = self::renderClosure($value, $level + 1, $plainText, $ansiColors);
119  } else {
120  $dump = self::renderObject($value, $level + 1, $plainText, $ansiColors);
121  }
122  }
123  return $dump;
124  }
125 
135  protected static function renderArray($array, $level, $plainText = false, $ansiColors = false)
136  {
137  $content = '';
138  $count = count($array);
139 
140  if ($plainText) {
141  $header = self::ansiEscapeWrap('array', '36', $ansiColors);
142  } else {
143  $header = '<span class="extbase-debug-type">array</span>';
144  }
145  $header .= $count > 0 ? '(' . $count . ' item' . ($count > 1 ? 's' : '') . ')' : '(empty)';
146  if ($level >= self::$maxDepth) {
147  if ($plainText) {
148  $header .= ' ' . self::ansiEscapeWrap('max depth', '47;30', $ansiColors);
149  } else {
150  $header .= '<span class="extbase-debug-filtered">max depth</span>';
151  }
152  } else {
153  $content = self::renderCollection($array, $level, $plainText, $ansiColors);
154  if (!$plainText) {
155  $header = ($level > 1 && $count > 0 ? '<input type="checkbox" /><span class="extbase-debug-header" >' : '<span>') . $header . '</span >';
156  }
157  }
158  if ($level > 1 && $count > 0 && !$plainText) {
159  $dump = '<span class="extbase-debugger-tree">' . $header . '<span class="extbase-debug-content">' . $content . '</span></span>';
160  } else {
161  $dump = $header . $content;
162  }
163  return $dump;
164  }
165 
175  protected static function renderObject($object, $level, $plainText = false, $ansiColors = false)
176  {
177  if ($object instanceof \TYPO3\CMS\Extbase\Persistence\Generic\LazyLoadingProxy) {
178  $object = $object->_loadRealInstance();
179  if (!$object) {
180  return gettype($object);
181  }
182  }
183  $header = self::renderHeader($object, $level, $plainText, $ansiColors);
184  if ($level < self::$maxDepth && !self::isBlacklisted($object) && !(self::isAlreadyRendered($object) && $plainText !== true)) {
185  $content = self::renderContent($object, $level, $plainText, $ansiColors);
186  } else {
187  $content = '';
188  }
189  if ($plainText) {
190  return $header . $content;
191  }
192  return '<span class="extbase-debugger-tree">' . $header . '<span class="extbase-debug-content">' . $content . '</span></span>';
193  }
194 
204  protected static function renderClosure($object, $level, $plainText = false, $ansiColors = false)
205  {
206  $header = self::renderHeader($object, $level, $plainText, $ansiColors);
207  if ($level < self::$maxDepth && (!self::isAlreadyRendered($object) || $plainText)) {
208  $content = self::renderContent($object, $level, $plainText, $ansiColors);
209  } else {
210  $content = '';
211  }
212  if ($plainText) {
213  return $header . $content;
214  }
215  return '<span class="extbase-debugger-tree"><input type="checkbox" /><span class="extbase-debug-header">' . $header . '</span><span class="extbase-debug-content">' . $content . '</span></span>';
216  }
217 
224  protected static function isBlacklisted($value)
225  {
226  $result = false;
227  if ($value instanceof \ReflectionProperty) {
228  $result = in_array($value->getName(), self::$blacklistedPropertyNames, true);
229  } elseif (is_object($value)) {
230  $result = in_array(get_class($value), self::$blacklistedClassNames, true);
231  }
232  return $result;
233  }
234 
241  protected static function isAlreadyRendered($object)
242  {
243  return self::$renderedObjects->contains($object);
244  }
245 
255  protected static function renderHeader($object, $level, $plainText, $ansiColors)
256  {
257  $dump = '';
258  $persistenceType = '';
259  $className = get_class($object);
260  $classReflection = new \ReflectionClass($className);
261  if ($plainText) {
262  $dump .= self::ansiEscapeWrap($className, '36', $ansiColors);
263  } else {
264  $dump .= '<span class="extbase-debug-type">' . $className . '</span>';
265  }
266  if (! $object instanceof \Closure) {
267  if ($object instanceof \TYPO3\CMS\Core\SingletonInterface) {
268  $scope = 'singleton';
269  } else {
270  $scope = 'prototype';
271  }
272  if ($plainText) {
273  $dump .= ' ' . self::ansiEscapeWrap($scope, '44;37', $ansiColors);
274  } else {
275  $dump .= $scope ? '<span class="extbase-debug-scope">' . $scope . '</span>' : '';
276  }
277  if ($object instanceof \TYPO3\CMS\Extbase\DomainObject\AbstractDomainObject) {
278  if ($object->_isDirty()) {
279  $persistenceType = 'modified';
280  } elseif ($object->_isNew()) {
281  $persistenceType = 'transient';
282  } else {
283  $persistenceType = 'persistent';
284  }
285  }
286  if ($object instanceof \TYPO3\CMS\Extbase\Persistence\ObjectStorage && $object->_isDirty()) {
287  $persistenceType = 'modified';
288  }
289  if ($object instanceof \TYPO3\CMS\Extbase\DomainObject\AbstractEntity) {
290  $domainObjectType = 'entity';
291  } elseif ($object instanceof \TYPO3\CMS\Extbase\DomainObject\AbstractValueObject) {
292  $domainObjectType = 'valueobject';
293  } else {
294  $domainObjectType = 'object';
295  }
296  if ($plainText) {
297  $dump .= ' ' . self::ansiEscapeWrap((($persistenceType ? $persistenceType . ' ' : '') . $domainObjectType), '42;30', $ansiColors);
298  } else {
299  $dump .= '<span class="extbase-debug-ptype">' . ($persistenceType ? $persistenceType . ' ' : '') . $domainObjectType . '</span>';
300  }
301  }
302  if (strpos(implode('|', self::$blacklistedClassNames), get_class($object)) > 0) {
303  if ($plainText) {
304  $dump .= ' ' . self::ansiEscapeWrap('filtered', '47;30', $ansiColors);
305  } else {
306  $dump .= '<span class="extbase-debug-filtered">filtered</span>';
307  }
308  } elseif (self::$renderedObjects->contains($object) && !$plainText) {
309  $dump = '<a href="javascript:;" onclick="document.location.hash=\'#' . spl_object_hash($object) . '\';" class="extbase-debug-seeabove">' . $dump . '<span class="extbase-debug-filtered">see above</span></a>';
310  } elseif ($level >= self::$maxDepth && !$object instanceof \DateTimeInterface) {
311  if ($plainText) {
312  $dump .= ' ' . self::ansiEscapeWrap('max depth', '47;30', $ansiColors);
313  } else {
314  $dump .= '<span class="extbase-debug-filtered">max depth</span>';
315  }
316  } elseif ($level > 1 && !$object instanceof \DateTimeInterface && !$plainText) {
317  if (($object instanceof \Countable && empty($object)) || empty($classReflection->getProperties())) {
318  $dump = '<span>' . $dump . '</span>';
319  } else {
320  $dump = '<input type="checkbox" id="' . spl_object_hash($object) . '" /><span class="extbase-debug-header">' . $dump . '</span>';
321  }
322  }
323  if ($object instanceof \Countable) {
324  $objectCount = count($object);
325  $dump .= $objectCount > 0 ? ' (' . $objectCount . ' items)' : ' (empty)';
326  }
327  if ($object instanceof \DateTimeInterface) {
328  $dump .= ' (' . $object->format(\DateTime::RFC3339) . ', ' . $object->getTimestamp() . ')';
329  }
330  if ($object instanceof \TYPO3\CMS\Extbase\DomainObject\DomainObjectInterface && !$object->_isNew()) {
331  $dump .= ' (uid=' . $object->getUid() . ', pid=' . $object->getPid() . ')';
332  }
333  return $dump;
334  }
335 
343  protected static function renderContent($object, $level, $plainText, $ansiColors)
344  {
345  $dump = '';
346  if ($object instanceof \TYPO3\CMS\Extbase\Persistence\ObjectStorage || $object instanceof \Iterator || $object instanceof \ArrayObject) {
347  $dump .= self::renderCollection($object, $level, $plainText, $ansiColors);
348  } else {
349  self::$renderedObjects->attach($object);
350  if (!$plainText) {
351  $dump .= '<a name="' . spl_object_hash($object) . '" id="' . spl_object_hash($object) . '"></a>';
352  }
353  if ($object instanceof \Closure) {
354  $dump .= PHP_EOL . str_repeat(self::PLAINTEXT_INDENT, $level)
355  . ($plainText ? '' : '<span class="extbase-debug-closure">')
356  . self::ansiEscapeWrap('function (', '33', $ansiColors) . ($plainText ? '' : '</span>');
357 
358  $reflectionFunction = new \ReflectionFunction($object);
359  $params = [];
360  foreach ($reflectionFunction->getParameters() as $parameter) {
361  $parameterDump = '';
362  if ($parameter->isArray()) {
363  if ($plainText) {
364  $parameterDump .= self::ansiEscapeWrap('array ', '36', $ansiColors);
365  } else {
366  $parameterDump .= '<span class="extbase-debug-type">array </span>';
367  }
368  } elseif ($parameter->getClass()) {
369  if ($plainText) {
370  $parameterDump .= self::ansiEscapeWrap($parameter->getClass()->name . ' ', '36', $ansiColors);
371  } else {
372  $parameterDump .= '<span class="extbase-debug-type">'
373  . htmlspecialchars($parameter->getClass()->name) . '</span>';
374  }
375  }
376  if ($parameter->isPassedByReference()) {
377  $parameterDump .= '&';
378  }
379  if ($parameter->isVariadic()) {
380  $parameterDump .= '...';
381  }
382  if ($plainText) {
383  $parameterDump .= self::ansiEscapeWrap('$' . $parameter->name, '37', $ansiColors);
384  } else {
385  $parameterDump .= '<span class="extbase-debug-property">'
386  . htmlspecialchars('$' . $parameter->name) . '</span>';
387  }
388  if ($parameter->isDefaultValueAvailable()) {
389  $parameterDump .= ' = ';
390  if ($plainText) {
391  $parameterDump .= self::ansiEscapeWrap(var_export($parameter->getDefaultValue(), true), '33', $ansiColors);
392  } else {
393  $parameterDump .= '<span class="extbase-debug-string">'
394  . htmlspecialchars(var_export($parameter->getDefaultValue(), true)) . '</span>';
395  }
396  }
397  $params[] = $parameterDump;
398  }
399  $dump .= implode(', ', $params);
400  if ($plainText) {
401  $dump .= self::ansiEscapeWrap(') {' . PHP_EOL, '33', $ansiColors);
402  } else {
403  $dump .= '<span class="extbase-debug-closure">) {' . PHP_EOL . '</span>';
404  }
405  $lines = file($reflectionFunction->getFileName());
406  for ($l = $reflectionFunction->getStartLine(); $l < $reflectionFunction->getEndLine() -1; ++$l) {
407  $dump .= $plainText ? $lines[$l] : htmlspecialchars($lines[$l]);
408  }
409  $dump .= str_repeat(self::PLAINTEXT_INDENT, $level);
410  if ($plainText) {
411  $dump .= self::ansiEscapeWrap('}' . PHP_EOL, '33', $ansiColors);
412  } else {
413  $dump .= '<span class="extbase-debug-closure">}</span>';
414  }
415  } else {
416  if (get_class($object) === 'stdClass') {
417  $objReflection = new \ReflectionObject($object);
418  $properties = $objReflection->getProperties();
419  } else {
420  $classReflection = new \ReflectionClass(get_class($object));
421  $properties = $classReflection->getProperties();
422  }
423  foreach ($properties as $property) {
424  if (self::isBlacklisted($property)) {
425  continue;
426  }
427  $dump .= PHP_EOL . str_repeat(self::PLAINTEXT_INDENT, $level);
428  if ($plainText) {
429  $dump .= self::ansiEscapeWrap($property->getName(), '37', $ansiColors);
430  } else {
431  $dump .= '<span class="extbase-debug-property">'
432  . htmlspecialchars($property->getName()) . '</span>';
433  }
434  $dump .= ' => ';
435  $property->setAccessible(true);
436  $visibility = ($property->isProtected() ? 'protected' : ($property->isPrivate() ? 'private' : 'public'));
437  if ($plainText) {
438  $dump .= self::ansiEscapeWrap($visibility, '42;30', $ansiColors) . ' ';
439  } else {
440  $dump .= '<span class="extbase-debug-visibility">' . $visibility . '</span>';
441  }
442  $dump .= self::renderDump($property->getValue($object), $level, $plainText, $ansiColors);
443  if ($object instanceof \TYPO3\CMS\Extbase\DomainObject\AbstractDomainObject && !$object->_isNew() && $object->_isDirty($property->getName())) {
444  if ($plainText) {
445  $dump .= ' ' . self::ansiEscapeWrap('modified', '43;30', $ansiColors);
446  } else {
447  $dump .= '<span class="extbase-debug-dirty">modified</span>';
448  }
449  }
450  }
451  }
452  }
453  return $dump;
454  }
455 
463  protected static function renderCollection($collection, $level, $plainText, $ansiColors)
464  {
465  $dump = '';
466  foreach ($collection as $key => $value) {
467  $dump .= PHP_EOL . str_repeat(self::PLAINTEXT_INDENT, $level) . ($plainText ? '' : '<span class="extbase-debug-property">') . self::ansiEscapeWrap($key, '37', $ansiColors) . ($plainText ? '' : '</span>') . ' => ';
468  $dump .= self::renderDump($value, $level, $plainText, $ansiColors);
469  }
470  if ($collection instanceof \Iterator && !$collection instanceof \Generator) {
471  $collection->rewind();
472  }
473  return $dump;
474  }
475 
484  protected static function ansiEscapeWrap($string, $ansiColors, $enable = true)
485  {
486  if ($enable) {
487  return '[' . $ansiColors . 'm' . $string . '';
488  }
489  return $string;
490  }
491 
506  public static function var_dump($variable, $title = null, $maxDepth = 8, $plainText = false, $ansiColors = true, $return = false, $blacklistedClassNames = null, $blacklistedPropertyNames = null)
507  {
508  self::$maxDepth = $maxDepth;
509  if ($title === null) {
510  $title = 'Extbase Variable Dump';
511  }
512  $ansiColors = $plainText && $ansiColors;
513  if ($ansiColors === true) {
514  $title = '' . $title . '';
515  }
516  $backupBlacklistedClassNames = self::$blacklistedClassNames;
517  if (is_array($blacklistedClassNames)) {
518  self::$blacklistedClassNames = $blacklistedClassNames;
519  }
520  $backupBlacklistedPropertyNames = self::$blacklistedPropertyNames;
521  if (is_array($blacklistedPropertyNames)) {
522  self::$blacklistedPropertyNames = $blacklistedPropertyNames;
523  }
524  self::clearState();
525  $css = '';
526  if (!$plainText && self::$stylesheetEchoed === false) {
527  $css = '
528  <style type=\'text/css\'>
529  .extbase-debugger-tree{position:relative}
530  .extbase-debugger-tree input{position:absolute !important;float: none !important;top:0;left:0;height:14px;width:14px;margin:0 !important;cursor:pointer;opacity:0;z-index:2}
531  .extbase-debugger-tree input~.extbase-debug-content{display:none}
532  .extbase-debugger-tree .extbase-debug-header:before{position:relative;top:3px;content:"";padding:0;line-height:10px;height:12px;width:12px;text-align:center;margin:0 3px 0 0;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkViZW5lXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMTIgMTIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDEyIDEyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4uc3Qwe2ZpbGw6Izg4ODg4ODt9PC9zdHlsZT48cGF0aCBpZD0iQm9yZGVyIiBjbGFzcz0ic3QwIiBkPSJNMTEsMTFIMFYwaDExVjExeiBNMTAsMUgxdjloOVYxeiIvPjxnIGlkPSJJbm5lciI+PHJlY3QgeD0iMiIgeT0iNSIgY2xhc3M9InN0MCIgd2lkdGg9IjciIGhlaWdodD0iMSIvPjxyZWN0IHg9IjUiIHk9IjIiIGNsYXNzPSJzdDAiIHdpZHRoPSIxIiBoZWlnaHQ9IjciLz48L2c+PC9zdmc+);display:inline-block}
533  .extbase-debugger-tree input:checked~.extbase-debug-content{display:inline}
534  .extbase-debugger-tree input:checked~.extbase-debug-header:before{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkViZW5lXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMTIgMTIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDEyIDEyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4uc3Qwe2ZpbGw6Izg4ODg4ODt9PC9zdHlsZT48cGF0aCBpZD0iQm9yZGVyIiBjbGFzcz0ic3QwIiBkPSJNMTEsMTFIMFYwaDExVjExeiBNMTAsMUgxdjloOVYxeiIvPjxnIGlkPSJJbm5lciI+PHJlY3QgeD0iMiIgeT0iNSIgY2xhc3M9InN0MCIgd2lkdGg9IjciIGhlaWdodD0iMSIvPjwvZz48L3N2Zz4=)}
535  .extbase-debugger{display:block;text-align:left;background:#2a2a2a;border:1px solid #2a2a2a;box-shadow:0 3px 0 rgba(0,0,0,.5);color:#000;margin:20px;overflow:hidden;border-radius:4px}
536  .extbase-debugger-floating{position:relative;z-index:999}
537  .extbase-debugger-top{background:#444;font-size:12px;font-family:monospace;color:#f1f1f1;padding:6px 15px}
538  .extbase-debugger-center{padding:0 15px;margin:15px 0;background-image:repeating-linear-gradient(to bottom,transparent 0,transparent 20px,#252525 20px,#252525 40px)}
539  .extbase-debugger-center,.extbase-debugger-center .extbase-debug-string,.extbase-debugger-center a,.extbase-debugger-center p,.extbase-debugger-center pre,.extbase-debugger-center strong{font-size:12px;font-weight:400;font-family:monospace;line-height:20px;color:#f1f1f1}
540  .extbase-debugger-center pre{background-color:transparent;margin:0;padding:0;border:0;word-wrap:break-word;color:#999}
541  .extbase-debugger-center .extbase-debug-string{color:#ce9178;white-space:normal}
542  .extbase-debugger-center .extbase-debug-type{color:#569CD6;padding-right:4px}
543  .extbase-debugger-center .extbase-debug-unregistered{background-color:#dce1e8}
544  .extbase-debugger-center .extbase-debug-filtered,.extbase-debugger-center .extbase-debug-proxy,.extbase-debugger-center .extbase-debug-ptype,.extbase-debugger-center .extbase-debug-visibility,.extbase-debugger-center .extbase-debug-scope{color:#fff;font-size:10px;line-height:12px;padding:2px 4px;margin-right:2px;position:relative;top:-1px}
545  .extbase-debugger-center .extbase-debug-scope{background-color:#497AA2}
546  .extbase-debugger-center .extbase-debug-ptype{background-color:#698747}
547  .extbase-debugger-center .extbase-debug-visibility{background-color:#698747}
548  .extbase-debugger-center .extbase-debug-dirty{background-color:#FFFFB6}
549  .extbase-debugger-center .extbase-debug-filtered{background-color:#4F4F4F}
550  .extbase-debugger-center .extbase-debug-seeabove{text-decoration:none;font-style:italic}
551  .extbase-debugger-center .extbase-debug-property{color:#f1f1f1}
552  .extbase-debugger-center .extbase-debug-closure{color:#9BA223;}
553  </style>';
554  self::$stylesheetEchoed = true;
555  }
556  if ($plainText) {
557  $output = $title . PHP_EOL . self::renderDump($variable, 0, true, $ansiColors) . PHP_EOL . PHP_EOL;
558  } else {
559  $output = '
560  <div class="extbase-debugger ' . ($return ? 'extbase-debugger-inline' : 'extbase-debugger-floating') . '">
561  <div class="extbase-debugger-top">' . htmlspecialchars($title) . '</div>
562  <div class="extbase-debugger-center">
563  <pre dir="ltr">' . self::renderDump($variable, 0, false, false) . '</pre>
564  </div>
565  </div>
566  ';
567  }
568  self::$blacklistedClassNames = $backupBlacklistedClassNames;
569  self::$blacklistedPropertyNames = $backupBlacklistedPropertyNames;
570  if ($return === true) {
571  return $css . $output;
572  }
573  echo $css . $output;
574 
575  return '';
576  }
577 }
debug($variable='', $name=' *variable *', $line=' *line *', $file=' *file *', $recursiveDepth=3, $debugLevel='E_DEBUG')
static renderHeader($object, $level, $plainText, $ansiColors)
static renderClosure($object, $level, $plainText=false, $ansiColors=false)
static renderArray($array, $level, $plainText=false, $ansiColors=false)
static renderDump($value, $level, $plainText, $ansiColors)
static renderObject($object, $level, $plainText=false, $ansiColors=false)