note 76076 added to function.var-dump
| From: | php at mikeboers dot com | Date: | Thu, 28 Jun 2007 23:27:59 +0000 |
| Subject: | note 76076 added to function.var-dump | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-128067@lists.php.net to get a copy of this message | ||
I've put a bit more thought into my solution below, and I've started working on something
a bit better. This one parses the serialized version of whatever you pass to it. The serialize
function already isolates all recursions, which made this pretty easy to do. I just need to set up
something so that it remembers which variable is at what line so that the recursions are easier to
understand.
The big progress here from the below is that it spits out protected and private members of classes!
Can anyone tell me if I have missed anything that the serialize would spit out? Right now it watches
for:
a, i, s, b, N, O, d, and r
Enjoy!
<?php
function var_log( $var ) {
$text = serialize( $var );
$level = 0 ;
$i = '| ';
$nl = "\n" ;
$class = Array() ;
$value = true ;
$buffer = '' ;
$elements = Array() ;
$reference = Array() ;
do {
$pre = $text ;
//echo ' - '.$text."\n" ;
$c = $level ;
$indent = '' ;
while( -- $c > 0 ) {
$indent .= $i ;
}
$value = !$value ;
$inner = count( $class ) > 0 ;
$array = end( $class ) == 'Array' ;
$method = $array ? ' = ' : ' -> ' ;
// integers
if( preg_match( '/^i:(-?\d+);/', $text, $m )) {
if( $inner ) {
$buffer .= ( $value ? '(int) '.$m[1].$nl : $i.$indent.$m[1].$method ) ;
} else {
$buffer .= '(int) '.$m[1].$nl ;
}
$text = substr( $text, strlen( $m[0] )) ;
// doubles/floats
} elseif( preg_match( '/^d:([-+E.\d]+);/', $text, $m )) {
if( $inner ) {
$buffer .= '(float) '.( (float) $m[1] ).$nl ;
} else {
$buffer .= '(float) '.( (float) $m[1] ).$nl ;
}
$text = substr( $text, strlen( $m[0] )) ;
// bools
} elseif( preg_match( '/^b:([01]);/', $text, $m )) {
$buffer .= ( !$inner || $value ? '' : $i.$indent ).'(bool) '. ( $m[1] ==
'1' ? 'true' : 'false' ) .$nl ;
$text = substr( $text, strlen( $m[0] )) ;
// string
} elseif( preg_match( '/^s:(\d+):"(.*?)";/', $text, $m )) {
if( $inner ) {
if( preg_match( '/\\0\\*\\0(.+)/', $m[2], $n ) ) {
$method = ' [protected] -> ' ;
$m[2] = $n[1] ;
} elseif( preg_match( '/\\0'.preg_quote(end($class)).'\\0(.+)/', $m[2], $n )
) {
$method = ' [private] -> ' ;
$m[2] = $n[1] ;
}
$buffer .= ( $value ? '(string('.$m[1].'))
"'.$m[2].'"'.$nl :
$i.$indent.'"'.$m[2].'"'.$method ) ;
} else {
$buffer .= '(string('.$m[1].')) "'.$m[2].'"'.$nl ;
}
$text = substr( $text, strlen( $m[0] )) ;
// array start
} elseif( preg_match( '/^a:\d+:{/', $text, $m )) {
++ $level ;
$class[] = 'Array' ;
$value = true ;
$buffer .= $indent.'Array ('.$nl ;
$text = substr( $text, strlen( $m[0] )) ;
// object start
} elseif( preg_match( '/^O:\d+:"(.+?)":\d+:{/', $text, $m )) {
++ $level ;
$class[] = $m[1] ;
$value = true ;
$buffer .= $indent.$m[1].' {'.$nl ;
$text = substr( $text, strlen( $m[0] )) ;
// array/object end
} elseif( preg_match( '/^};?/', $text, $m )) {
-- $level ;
$value = true ;
$buffer .= $indent. ( $array ? ')' : '}' ) .$nl ;
$text = substr( $text, strlen( $m[0] )) ;
// recursions
} elseif( preg_match( '/^r:(\d+);/', $text, $m )) {
$buffer .= '(recursion) line #'.$m[1] .$nl ;
$text = substr( $text, strlen( $m[0] )) ;
// null
} elseif( preg_match( '/^N;/', $text, $m )) {
$buffer .= '(null)'.$nl ;
$text = substr( $text, strlen( $m[0] )) ;
}
} while( $pre != $text && $text != '' ) ;
return $text == '' ? $buffer : false ;
}
class A {
public $a = 0 ;
protected $be = 1 ;
public $d = '3' ;
private $cee = 2 ;
}
$a = new A() ;
$b = new A() ;
$a -> d = $b ;
$b -> a = $a ;
$b -> d = $a ;
$b -> e = $b ;
$tests = Array(
1,
-213,
true,
false,
null,
2e34,
-3e-14,
'string "quoting" \'quotes\'',
Array(1,2=>3,true,2e34,null,5=>false,Array(2,5,22232,true)),
new A(),
$a
) ;
echo '<pre>' ;
foreach( $tests as $key => $test ) {
echo "-- $key --\n" ;
// echo serialize( $test )."\n" ;
echo var_log( $test ) ;
echo "\n";
}
?>
----
Server IP: 69.147.83.197
Probable Submitter: 99.247.248.117
----
Manual Page -- http://www.php.net/manual/en/function.var-dump.php
Edit -- https://master.php.net/note/edit/76076
Del: integrated -- https://master.php.net/note/delete/76076/integrated
Del: useless -- https://master.php.net/note/delete/76076/useless
Del: bad code -- https://master.php.net/note/delete/76076/bad+code
Del: spam -- https://master.php.net/note/delete/76076/spam
Del: non-english -- https://master.php.net/note/delete/76076/non-english
Del: in docs -- https://master.php.net/note/delete/76076/in+docs
Del: other reasons-- https://master.php.net/note/delete/76076
Reject -- https://master.php.net/note/reject/76076
Search -- https://master.php.net/manage/user-notes.php