将“var_dump”发送到 FireBug 控制台

Posted

技术标签:

【中文标题】将“var_dump”发送到 FireBug 控制台【英文标题】:Sending "var_dump" to FireBug console 【发布时间】:2013-02-06 08:47:54 【问题描述】:

如您所知,var_dump() 除了值显示其数据类型长度

有没有办法将其输出记录到 FireBug 控制台

我尝试了 FirePHPFireLogger 但都只输出变量的值(有时甚至不正确的变量值)。

【问题讨论】:

你试过任何调试器吗?喜欢 xdebug 吗? @SujitSingh 我希望输出显示在控制台上,当您开发 MVC 应用程序时,当从控制器或模型调用 xdebug 时,您看不到输出。 @phpst 你用的是框架还是什么的? 对我来说,这有点像“把东西放在他们不属于的东西里”。 Firebug 旨在处理客户端发生的事情:css、html、js、事件、xhr 等。而不是在服务器端。通常是好的框架,可以在构建页面时查看他们身边发生的事情。 Symfony、Django、ZF 等 .. 有一个 Web 调试工具栏。这是一种服务器端的萤火虫。我建议您做的不是在一个地方查看渲染和服务器端调试,而是将var_dump()(也许var_export(..., true) 可能更好)放在一个日志文件中并尾随该文件 我认为您应该更具体地说明为什么 FirePHP 或 FireLogger 不能为您完成这项工作,因为这两个工具正是针对这种情况的。 【参考方案1】:

也许你需要的是这样的:

function var2console($var, $name='', $now=false)

   if ($var === null)          $type = 'NULL';
   else if (is_bool    ($var)) $type = 'BOOL';
   else if (is_string  ($var)) $type = 'STRING['.strlen($var).']';
   else if (is_int     ($var)) $type = 'INT';
   else if (is_float   ($var)) $type = 'FLOAT';
   else if (is_array   ($var)) $type = 'ARRAY['.count($var).']';
   else if (is_object  ($var)) $type = 'OBJECT';
   else if (is_resource($var)) $type = 'RESOURCE';
   else                        $type = '???';
   if (strlen($name)) 
      str2console("$type $name = ".var_export($var, true).';', $now);
    else 
      str2console("$type = "      .var_export($var, true).';', $now);
   


function str2console($str, $now=false)

   if ($now) 
      echo "<script type='text/javascript'>\n";
      echo "//<![CDATA[\n";
      echo "console.log(", json_encode($str), ");\n";
      echo "//]]>\n";
      echo "</script>";
    else 
      register_shutdown_function('str2console', $str, true);
   

用法:var2console($myvar, '$myvar'); 或简称为var2console($myvar);

很少需要将$now 参数设置为true,从而导致&lt;script&gt; 标记的立即输出。使用register_shutdown_function() 的好处是无需关注HTML 中的“你在哪里”。

json_encode() 保留从 PHP 到 JavaScript 的传输中的所有字符。唯一需要注意的是编码:json_encode() 仅适用于UTF-8(无论如何,在大多数情况下这是推荐的编码)。如果您使用不同的编码,您可能需要utf8_encode()mb_convert_encoding() 之类的东西(或者更确切地说,您可以考虑切换到UTF-8)。

Firebug 控制台的输出只是 var_export() 的输出,前面是变量的类型,包括字符串的长度和数组的数量,还可以选择变量的名称。

var_export() 提供比var_dump() 更具可读性的输出。如果你真的需要var_dump()的输出,你可以使用这样的东西:

function dump2console($var, $name='', $now=false)

   ob_start();
   if (strlen($name)) 
      echo "$name =\n";
   
   var_dump($var);
   $str = ob_get_clean();
   str2console($str, $now);

用法:dump2console($myvar, '$myvar'); 或简称为dump2console($myvar);

您应该避免循环引用(var_dump() 检测到它们为时已晚,而var_export() 根本没有检测到它们)。这是如何做到的,例如,$GLOBALS:

function globals2console($now=false)

   $g = $GLOBALS;
   $g['GLOBALS'] = '(recursion)';
   var2console($g, '$GLOBALS', $now);

【讨论】:

为什么不使用gettype() 轻松确定变量类型? @PHPst 只是为了完全控制。我更喜欢 bool 而不是 boolean,float 而不是 double(谁知道呢,也许你更喜欢 int 而不是 integer)——而且我已经需要 ifs 来添加字符串的长度和数组的数量。【参考方案2】:

您可以通过将 console.log() 放在脚本标签中来将 JavaScript 转储到控制台:

<script type="text/javascript">
console.log("hello");
</script>

所以如果你在那里做一个 php 转储......

<script type="text/javascript">
console.log("<?php var_dump('abc'); ?>");
</script>

你只需要小心 var_dump 中的 ' 和 " 会破坏你的 JavaScript。在这个例子中它会没问题,因为 HTML 会是:

<script type="text/javascript">
console.log("string 'abc' (length=3)");
</script>

只要记住 php 被处理然后放入 JavaScript。 您也可以将其转储到评论中:

<!--
<?php 
var_dump('abc');
?>
-->

然后你可以查看源代码,或者检查元素。

【讨论】:

这在 MVC 中不实用 那么另一个好问题可能是如何在 MVC 中实现这一点。这对于测试和获取值来说很好,但是如果你想在生产中使用它,你可能应该考虑将你的 php 覆盖到 json,这样你就可以在 JavaScript 中正确处理它。 我会赞成你的回答。正是我要写的内容。 在我的 PHP var_dump('abc') 中是 string(3) "abc",它已经破坏了代码,但是由于换行符,任何数组也会破坏它。【参考方案3】:
<script>console.log( <?= json_encode( $var ) ?> )</script>

只是把我的帽子扔进擂台。听起来 FirePHP 是最好的选择。

【讨论】:

这是一个很好的答案。请注意,&lt;?=&lt;?php echo 的简写,我没有启用此功能,所以对我有用的是:&lt;script&gt;console.log( &lt;?php echo json_encode( $var ) ?&gt; )&lt;/script&gt;【参考方案4】:

FirePHP 做得很好 + 你可以在开发 Ajax 时使用它。

示例代码:

require_once('FirePHPCore/fb.php'); # add the library

fb($var); #log the variable
fb( var_export($var,true) ); # log the variable with the var_export format

如果您将数组传递给它,您可以从控制台单击它,它会在您的屏幕上打开一个弹出窗口。您甚至可以展开/折叠数组和对象。

编辑: 如果您正在寻找数据类型和长度,请使用var_dump()

fb( var_dump( array(
    1,
    'a',
    true
  ) ) );

【讨论】:

你在发布之前测试过你的答案吗? fb(var_export($var,true));只呼应价值! 是的,它与浏览器控制台中的值相呼应。如果您希望它可点击并弹出,则应将其作为数组传递fb( array( var_export($var,true) ), 'TEST TITLE' ); fb($var);fb( var_export($var,true) );的输出对我来说是相同的。【参考方案5】:

我总是将此脚本与 Zend_Log_Writer_Firebug 结合使用(使用 firephp http://www.firephp.org/),因为在应用程序或 ajax 请求中重定向后,使用 xdebug 调试并不总是按预期工作:

require_once '/Zend/Log.php';
require_once '/Zend/Log/Writer/Firebug.php';  
require_once '/Zend/Controller/Response/Http.php';
require_once '/Zend/Controller/Request/Http.php';

// create the logger and log writer
$writer = new Zend_Log_Writer_Firebug();
$logger = new Zend_Log($writer);

// get the wildfire channel
$channel = Zend_Wildfire_Channel_HttpHeaders::getInstance();

// create and set the HTTP response
$response = new Zend_Controller_Response_Http();
$channel->setResponse($response);

// create and set the HTTP request
$channel->setRequest(new Zend_Controller_Request_Http());

// record log messages
$logger->info('test');
$logger->info(var_export($_SESSION,true));
$logger->info(count(var_export($_SESSION,true)));
$logger->info(strlen(var_export('hello',true)));
$logger->info(get_type($_SESSION,true));  

// insert the wildfire headers into the HTTP response
$channel->flush();

// send the HTTP response headers
$response->sendHeaders();

您可以构建自己的库来获取变量的类型:

<?php
function get_type($var) 

    if(is_object($var))
        return get_class($var);
    if(is_null($var))
        return 'null';
    if(is_string($var))
        return 'string';
    if(is_array($var))
        return 'array';
    if(is_int($var))
        return 'integer';
    if(is_bool($var))
        return 'boolean';
    if(is_float($var))
        return 'float';
    if(is_resource($var))
        return 'resource';
    //throw new NotImplementedException();
    return 'unknown';

?>

使用对 var_dump_ret 的函数调用作为 $logger->info() 的参数也可能会有所帮助。我还没有测试过。

function var_dump_ret($mixed = null) 
  ob_start();
  var_dump($mixed);
  $content = ob_get_contents();
  ob_end_clean();
  return $content;

【讨论】:

谢谢,为什么不使用 gettype() 轻松确定变量的类型? 德语 gettype php 文档页面上有一条警告:php.net/manual/de/function.gettype.php - 翻译为“出于性能原因”;-)。 get_type() 是用户定义的函数 - gettype() 是 php 函数。下划线很重要。【参考方案6】:

如果您只是想在 firebug(客户端)中看到 var_dump 输出 而不用 Javascript 做任何事情,我建议您使用 cookies 以下是说明如何以这种方式执行它:

<?php
$str =  "Abu Romaïssae";

sendVarDumpToFront($str);

echo "<pre>";
echo $str."\n";

function sendVarDumpToFront( $mixed )
    ob_start();
    var_dump($mixed);
    $content = ob_get_contents();
    ob_end_clean();
    setcookie("var_dump",$content);

你可以通过这种方式在 firebug 中使用它:

重要

由于这种方式使用 cookie,因此您必须在输出任何内容之前放置 var_dump 内容,否则这将不起作用

【讨论】:

【参考方案7】:

发件人:http://sixrevisions.com/web-development/how-to-debug-php-using-firefox-with-firephp/ Fb::log($array, "dumping an array") 这将为您提供类型和数据。您必须手动进行额外的日志记录以获取长度/计数。

【讨论】:

【参考方案8】:

以下内容将从 var_dump() 中获取任何内容,并在尝试将其发送到 console.log() 之前将其编码为 JSON。这可以防止特殊字符弄乱输出。

<?php
$myArray = array('Red','Green','Blue','Orange','Yellow','Purple');

ob_start();
var_dump($myArray);
$var_dump = ob_get_contents();
ob_end_clean();
?>

<script>
var var_dump = <?php echo json_encode($var_dump); ?>;
console.log(var_dump);
</script>

【讨论】:

【参考方案9】:

如果您有使用 var_dump() 生成输出的 Ajax (XHR) 调用,那么您可以在 FireBug 中的 'Console''Net' 下检查请求强>。 单击加号将其展开并查看“响应”标签。

否则,如果您将 var_dump() 放入您正在查看的主页中,它应该只显示在所查看的页面中,尽管格式可能会被弄乱。试试看

echo '<PRE>' 

在 var_dump() 之前,或者查看页面源而不是直接输出。

【讨论】:

【参考方案10】:

我认为实现这个目标的一个简单方法是做一个简单的

console.log(&lt;?php var_export($var, true) ?&gt;);

【讨论】:

【参考方案11】:

你把一个简单的问题复杂化了。 Firebug(以及任何其他控制台/dom 日志查看器用于查看客户端输出。PHP 是服务器端,推送到控制台日志没有多大意义。

话虽如此,如果您真的想将服务器端输出通过管道传输到控制台日志,您应该将该输出转换为 json 并将其传递到控制台日志。如果您只是想在生活站点上输出变量值,而人们不知道您正在使用它(而且您无论如何都不应该使用实时版本,但这不是重点)为什么不将输出通过管道传输到文件并读取无论你喜欢什么输出,你甚至可以使用 ajax 通过 jquery 将转储传递给日志。

我想说的是……你把你想做的事情过于复杂了。

【讨论】:

【参考方案12】:

仅从 JavaScript 到 jquery 来自 firebug 和 chrome 中的数组是:

 console.dir('[object arrays]'); 

打开控制台并激活到 F12... 并在控制台中编写此代码是从 jquery 到 php 的 var_dump。数组转json

var test = "names":["john doe","JANE doe"],"ids":["123",null]; console.dir(test);

如果你需要直接从 PHP 开始控制台需要一个插件

【讨论】:

以上是关于将“var_dump”发送到 FireBug 控制台的主要内容,如果未能解决你的问题,请参考以下文章

使用邮递员将文件发送到 Laravel API

Laravel Homestead 在单元测试期间未使用 var_dump() 或 dump() 打印到控制台

如何在 Chrome、Firebug 和 Firefox 的控制台中显示数组的所有条目?

Firebug控制台详解

将Firebug添加到任何浏览器

清除 Firebug 控制台的快捷方式