note 76076 added to function.var-dump

From: 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

« previous php.notes (#128067) next »