Chris@0: . Chris@0: */ Chris@0: Chris@0: namespace Doctrine\Common\Util; Chris@0: Chris@0: use Doctrine\Common\Collections\Collection; Chris@0: use Doctrine\Common\Persistence\Proxy; Chris@0: Chris@0: /** Chris@0: * Static class containing most used debug methods. Chris@0: * Chris@0: * @link www.doctrine-project.org Chris@0: * @since 2.0 Chris@0: * @author Guilherme Blanco Chris@0: * @author Jonathan Wage Chris@0: * @author Roman Borschel Chris@0: * @author Giorgio Sironi Chris@0: */ Chris@0: final class Debug Chris@0: { Chris@0: /** Chris@0: * Private constructor (prevents instantiation). Chris@0: */ Chris@0: private function __construct() Chris@0: { Chris@0: } Chris@0: Chris@0: /** Chris@0: * Prints a dump of the public, protected and private properties of $var. Chris@0: * Chris@0: * @link http://xdebug.org/ Chris@0: * Chris@0: * @param mixed $var The variable to dump. Chris@0: * @param integer $maxDepth The maximum nesting level for object properties. Chris@0: * @param boolean $stripTags Whether output should strip HTML tags. Chris@0: * @param boolean $echo Send the dumped value to the output buffer Chris@0: * Chris@0: * @return string Chris@0: */ Chris@0: public static function dump($var, $maxDepth = 2, $stripTags = true, $echo = true) Chris@0: { Chris@0: $html = ini_get('html_errors'); Chris@0: Chris@0: if ($html !== true) { Chris@0: ini_set('html_errors', true); Chris@0: } Chris@0: Chris@0: if (extension_loaded('xdebug')) { Chris@0: ini_set('xdebug.var_display_max_depth', $maxDepth); Chris@0: } Chris@0: Chris@12: $var = self::export($var, $maxDepth); Chris@0: Chris@0: ob_start(); Chris@0: var_dump($var); Chris@0: Chris@0: $dump = ob_get_contents(); Chris@0: Chris@0: ob_end_clean(); Chris@0: Chris@0: $dumpText = ($stripTags ? strip_tags(html_entity_decode($dump)) : $dump); Chris@0: Chris@0: ini_set('html_errors', $html); Chris@12: Chris@0: if ($echo) { Chris@0: echo $dumpText; Chris@0: } Chris@12: Chris@0: return $dumpText; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @param mixed $var Chris@0: * @param int $maxDepth Chris@0: * Chris@0: * @return mixed Chris@0: */ Chris@0: public static function export($var, $maxDepth) Chris@0: { Chris@0: $return = null; Chris@0: $isObj = is_object($var); Chris@0: Chris@0: if ($var instanceof Collection) { Chris@0: $var = $var->toArray(); Chris@0: } Chris@0: Chris@12: if (! $maxDepth) { Chris@12: return is_object($var) ? get_class($var) Chris@0: : (is_array($var) ? 'Array(' . count($var) . ')' : $var); Chris@0: } Chris@0: Chris@12: if (is_array($var)) { Chris@12: $return = []; Chris@12: Chris@12: foreach ($var as $k => $v) { Chris@12: $return[$k] = self::export($v, $maxDepth - 1); Chris@12: } Chris@12: Chris@12: return $return; Chris@12: } Chris@12: Chris@12: if (! $isObj) { Chris@12: return $var; Chris@12: } Chris@12: Chris@12: $return = new \stdclass(); Chris@12: if ($var instanceof \DateTimeInterface) { Chris@12: $return->__CLASS__ = get_class($var); Chris@12: $return->date = $var->format('c'); Chris@12: $return->timezone = $var->getTimezone()->getName(); Chris@12: Chris@12: return $return; Chris@12: } Chris@12: Chris@12: $return->__CLASS__ = ClassUtils::getClass($var); Chris@12: Chris@12: if ($var instanceof Proxy) { Chris@12: $return->__IS_PROXY__ = true; Chris@12: $return->__PROXY_INITIALIZED__ = $var->__isInitialized(); Chris@12: } Chris@12: Chris@12: if ($var instanceof \ArrayObject || $var instanceof \ArrayIterator) { Chris@12: $return->__STORAGE__ = self::export($var->getArrayCopy(), $maxDepth - 1); Chris@12: } Chris@12: Chris@12: return self::fillReturnWithClassAttributes($var, $return, $maxDepth); Chris@12: } Chris@12: Chris@12: /** Chris@12: * Fill the $return variable with class attributes Chris@12: * Chris@12: * @param object $var Chris@12: * @param stdClass $return Chris@12: * @param int $maxDepth Chris@12: * Chris@12: * @return mixed Chris@12: */ Chris@12: private static function fillReturnWithClassAttributes($var, \stdClass $return, $maxDepth) Chris@12: { Chris@12: $reflClass = ClassUtils::newReflectionObject($var); Chris@12: $parsedAttributes = array(); Chris@12: do { Chris@12: $currentClassName = $reflClass->getName(); Chris@12: Chris@12: foreach ($reflClass->getProperties() as $reflProperty) { Chris@12: $attributeKey = $reflProperty->isPrivate() ? $currentClassName . '#' : ''; Chris@12: $attributeKey .= $reflProperty->getName(); Chris@12: Chris@12: if (isset($parsedAttributes[$attributeKey])) { Chris@12: continue; Chris@12: } Chris@12: Chris@12: $parsedAttributes[$attributeKey] = true; Chris@12: Chris@12: $name = Chris@12: $reflProperty->getName() Chris@12: . ($return->__CLASS__ !== $currentClassName || $reflProperty->isPrivate() ? ':' . $currentClassName : '') Chris@12: . ($reflProperty->isPrivate() ? ':private' : '') Chris@12: . ($reflProperty->isProtected() ? ':protected' : '') Chris@12: ; Chris@12: Chris@12: $reflProperty->setAccessible(true); Chris@12: $return->$name = self::export($reflProperty->getValue($var), $maxDepth - 1); Chris@12: } Chris@12: } while ($reflClass = $reflClass->getParentClass()); Chris@12: Chris@0: return $return; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Returns a string representation of an object. Chris@0: * Chris@0: * @param object $obj Chris@0: * Chris@0: * @return string Chris@0: */ Chris@0: public static function toString($obj) Chris@0: { Chris@0: return method_exists($obj, '__toString') ? (string) $obj : get_class($obj) . '@' . spl_object_hash($obj); Chris@0: } Chris@0: }