由var_dump引发的问题

今天在看书学习php时使用了var_dump函数来调试程序,输出变量到浏览器时发现打印的数组变量在浏览器的显示非常的不友好,通常我会直接来看浏览器源码,因为源码里格式是友好的,今天突然觉得这样太烦了,就自己写一个类似于thinkphp里的dump函数来输出,本想这是很简单的一个事情于是就写了如下的dump函数。

function dump($var,$strict=true){
     $output=($strict)?var_dump($var,true):print_r($var,true);
     echo '<pre>'.$output.'</pre>';

 }
不知道有某有童鞋看出什么问题来?后来我调用严格模式的时候总是多打印一个true,我想了一会子也没想出什么问题,后面再仔细看看php手册才恍然大悟想要拍死自己,原来var_dump并不是和print_r一样可以返回打印的字符串!!var_dump可以有一个或多个参数,可以打印多个变量,比如var_dump($var1,$var2,$var3),这样一次打出三个给出的变量。同样可以接受多个参数的还有一个isset,当所有给定的变量都定义了才返回true。再回到刚才的问题,当var_dump不能保存到字符串中怎么办?这时我们想起php里有一类输出控制函数,本用于解决在已经输出字符后如何使用header发送头部的问题,还有可以使用这组函数来实现静态html文件的获取,不了解的童鞋赶紧去手册里看看吧。下面我们直接拷贝thinkphp里dump的写法:
 
/**
 * 浏览器友好的变量输出
 * @param mixed $var 变量
 * @param boolean $echo 是否输出 默认为True 如果为false 则返回输出字符串
 * @param string $label 标签 默认为空
 * @param boolean $strict 是否严谨 默认为true
 * @return void|string
 */
 function dump($var, $echo=true, $label=null, $strict=true) {
     $label = ($label === null) ? '' : rtrim($label) . ' ';
     if (!$strict) {
         if (ini_get('html_errors')) {
             $output = print_r($var, true);
             $output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>';
         } else {
             $output = $label . print_r($var, true);
         }
     } else {
         ob_start();
         var_dump($var);
         $output = ob_get_clean();
         if (!extension_loaded('xdebug')) {
             $output = preg_replace('/\]\=\>\n(\s+)/m', '] => ', $output);
             $output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>';
         }
     }
     if ($echo) {
         echo($output);
         return null;
     }else
         return $output;
 }
看到tp里dump的写法我才发现之前没有更好的去用它,首先这里也给了两种模式,如果是严谨模式则调用var_dump,否则调用print_r,其次这里给了label参数,这个是我本没有想到他会提供的,就是当我们在代码的多处dump变量时可以加上label,这样就能知道是在什么地方打印的变量,这样也就更加清晰。而且在这个函数里还考虑了一种情况,比如我们使用var_dump(‘<html>’),那么在浏览器里是看不到这个字符串的,因为被浏览器解析成html标签了,这个是我所没想到的。可见tp的函数还是非常严谨的。

由var_dump引发的问题》有3个想法

发表评论

邮箱地址不会被公开。