2015-08-17 17:00:26 -07:00
< ? php
namespace Doctrine\Common\Util ;
2017-04-13 15:53:35 +01:00
use Doctrine\Common\Collections\Collection ;
2015-08-17 17:00:26 -07:00
use Doctrine\Common\Persistence\Proxy ;
/**
* Static class containing most used debug methods .
*
* @ link www . doctrine - project . org
* @ since 2.0
* @ author Guilherme Blanco < guilhermeblanco @ hotmail . com >
* @ author Jonathan Wage < jonwage @ gmail . com >
* @ author Roman Borschel < roman @ code - factory . org >
* @ author Giorgio Sironi < piccoloprincipeazzurro @ gmail . com >
2018-11-23 12:29:20 +00:00
*
* @ deprecated The Debug class is deprecated , please use symfony / var - dumper instead .
2015-08-17 17:00:26 -07:00
*/
final class Debug
{
/**
* Private constructor ( prevents instantiation ) .
*/
private function __construct ()
{
}
/**
* Prints a dump of the public , protected and private properties of $var .
*
2018-11-23 12:29:20 +00:00
* @ link https :// xdebug . org /
2015-08-17 17:00:26 -07:00
*
* @ param mixed $var The variable to dump .
* @ param integer $maxDepth The maximum nesting level for object properties .
* @ param boolean $stripTags Whether output should strip HTML tags .
2015-10-08 11:40:12 -07:00
* @ param boolean $echo Send the dumped value to the output buffer
*
* @ return string
2015-08-17 17:00:26 -07:00
*/
2015-10-08 11:40:12 -07:00
public static function dump ( $var , $maxDepth = 2 , $stripTags = true , $echo = true )
2015-08-17 17:00:26 -07:00
{
2015-10-08 11:40:12 -07:00
$html = ini_get ( 'html_errors' );
if ( $html !== true ) {
ini_set ( 'html_errors' , true );
}
2015-08-17 17:00:26 -07:00
if ( extension_loaded ( 'xdebug' )) {
ini_set ( 'xdebug.var_display_max_depth' , $maxDepth );
}
2017-04-13 15:53:35 +01:00
$var = self :: export ( $var , $maxDepth );
2015-08-17 17:00:26 -07:00
ob_start ();
var_dump ( $var );
2015-10-08 11:40:12 -07:00
2015-08-17 17:00:26 -07:00
$dump = ob_get_contents ();
2015-10-08 11:40:12 -07:00
2015-08-17 17:00:26 -07:00
ob_end_clean ();
2015-10-08 11:40:12 -07:00
$dumpText = ( $stripTags ? strip_tags ( html_entity_decode ( $dump )) : $dump );
2015-08-17 17:00:26 -07:00
2015-10-08 11:40:12 -07:00
ini_set ( 'html_errors' , $html );
2017-04-13 15:53:35 +01:00
2015-10-08 11:40:12 -07:00
if ( $echo ) {
echo $dumpText ;
}
2017-04-13 15:53:35 +01:00
2015-10-08 11:40:12 -07:00
return $dumpText ;
2015-08-17 17:00:26 -07:00
}
/**
* @ param mixed $var
* @ param int $maxDepth
*
* @ return mixed
*/
public static function export ( $var , $maxDepth )
{
$return = null ;
2018-11-23 12:29:20 +00:00
$isObj = is_object ( $var );
2015-08-17 17:00:26 -07:00
2017-04-13 15:53:35 +01:00
if ( $var instanceof Collection ) {
2015-08-17 17:00:26 -07:00
$var = $var -> toArray ();
}
2018-11-23 12:29:20 +00:00
if ( ! $maxDepth ) {
2017-04-13 15:53:35 +01:00
return is_object ( $var ) ? get_class ( $var )
: ( is_array ( $var ) ? 'Array(' . count ( $var ) . ')' : $var );
}
2015-08-17 17:00:26 -07:00
2017-04-13 15:53:35 +01:00
if ( is_array ( $var )) {
$return = [];
foreach ( $var as $k => $v ) {
$return [ $k ] = self :: export ( $v , $maxDepth - 1 );
2015-08-17 17:00:26 -07:00
}
2017-04-13 15:53:35 +01:00
return $return ;
2015-08-17 17:00:26 -07:00
}
2018-11-23 12:29:20 +00:00
if ( ! $isObj ) {
2017-04-13 15:53:35 +01:00
return $var ;
}
$return = new \stdclass ();
if ( $var instanceof \DateTimeInterface ) {
$return -> __CLASS__ = get_class ( $var );
2018-11-23 12:29:20 +00:00
$return -> date = $var -> format ( 'c' );
$return -> timezone = $var -> getTimezone () -> getName ();
2017-04-13 15:53:35 +01:00
return $return ;
}
$return -> __CLASS__ = ClassUtils :: getClass ( $var );
if ( $var instanceof Proxy ) {
2018-11-23 12:29:20 +00:00
$return -> __IS_PROXY__ = true ;
2017-04-13 15:53:35 +01:00
$return -> __PROXY_INITIALIZED__ = $var -> __isInitialized ();
}
if ( $var instanceof \ArrayObject || $var instanceof \ArrayIterator ) {
$return -> __STORAGE__ = self :: export ( $var -> getArrayCopy (), $maxDepth - 1 );
}
return self :: fillReturnWithClassAttributes ( $var , $return , $maxDepth );
}
/**
* Fill the $return variable with class attributes
2018-11-23 12:29:20 +00:00
* Based on obj2array function from { @ see https :// secure . php . net / manual / en / function . get - object - vars . php #47075}
2017-04-13 15:53:35 +01:00
*
* @ param object $var
2018-11-23 12:29:20 +00:00
* @ param \stdClass $return
2017-04-13 15:53:35 +01:00
* @ param int $maxDepth
*
* @ return mixed
*/
private static function fillReturnWithClassAttributes ( $var , \stdClass $return , $maxDepth )
{
2018-11-23 12:29:20 +00:00
$clone = ( array ) $var ;
foreach ( array_keys ( $clone ) as $key ) {
$aux = explode ( " \0 " , $key );
$name = end ( $aux );
if ( $aux [ 0 ] === '' ) {
$name .= ':' . ( $aux [ 1 ] === '*' ? 'protected' : $aux [ 1 ] . ':private' );
2017-04-13 15:53:35 +01:00
}
2018-11-23 12:29:20 +00:00
$return -> $name = self :: export ( $clone [ $key ], $maxDepth - 1 );
;
}
2017-04-13 15:53:35 +01:00
2015-08-17 17:00:26 -07:00
return $return ;
}
/**
* Returns a string representation of an object .
*
* @ param object $obj
*
* @ return string
*/
public static function toString ( $obj )
{
return method_exists ( $obj , '__toString' ) ? ( string ) $obj : get_class ( $obj ) . '@' . spl_object_hash ( $obj );
}
}