note 76076 deleted from function.var-dump by nlopess
| From: | nlopess@php.net | Date: | Fri, 29 Jun 2007 09:16:40 +0000 |
| Subject: | note 76076 deleted from function.var-dump by nlopess | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-128080@lists.php.net to get a copy of this message | ||
Note Submitter: php at mikeboers dot com
Reason: useless
----
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";
}
?>