如您所知var_dump()
,除了 value 还显示其数据类型和length。
有没有办法将其输出记录到FireBug 控制台?
我尝试了FirePHP和FireLogger,但都只输出变量的值(有时甚至不正确的变量值)。
也许你需要的是这样的:
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
,从而导致<script>
标签立即输出。使用的好处register_shutdown_function()
是不需要关注 HTML 中的“你在哪里”。
保留从 PHP 到 JavaScript 的传输中的json_encode()
所有字符。唯一需要注意的是编码: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);
}
您可以通过将 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');
?>
-->
然后您可以查看源代码或检查元素。
<script>console.log( <?= json_encode( $var ) ?> )</script>
只是把我的帽子扔进戒指。听起来 FirePHP 是最好的选择。
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
) ) );
我总是将此脚本与 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;
}
如果您只想查看var_dump
firebug(客户端)中的输出而不在 Javascript 中执行任何操作,我建议您使用cookie以下是如何以这种方式执行它的说明:
<?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);
}
比你可以通过这种方式在萤火虫中拥有它:
重要的
由于这种方式使用 cookie,因此您必须在输出任何内容之前放置 var_dump 内容,否则这将不起作用
来自:http
Fb::log($array, "dumping an array")
://sixrevisions.com/web-development/how-to-debug-php-using-firefox-with-firephp/
这将为您提供类型和数据。您必须手动进行额外的日志记录以获取长度/计数。
以下将从 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>
如果您有一个使用 var_dump() 生成输出的 Ajax (XHR) 调用,那么您可以在 FireBug 中的'Console'或'Net'下检查请求。单击加号将其展开并查看“响应”选项卡。
否则,如果您将 var_dump() 放入您正在查看的主页中,它应该只显示在所查看的页面中,尽管格式可能会混乱。尝试
echo '<PRE>'
在 var_dump() 之前,或者查看页面源而不是直接输出。
我认为实现这一目标的一种简单方法是做一个简单的
console.log(<?php var_export($var, true) ?>);
你把一个简单的问题复杂化了。Firebug(以及任何其他控制台/dom 日志查看器用于查看客户端输出。PHP 是服务器端,推送到控制台日志没有多大意义。
话虽如此,如果您真的想将服务器端输出通过管道传输到控制台日志,您应该将该输出转换为 json 并将其传递到控制台日志。如果您只是想在生活站点上输出变量值,而人们不知道您正在使用它(而且您无论如何都不应该使用实时版本,但这不是重点)为什么不将输出通过管道传输到文件并读取无论您喜欢该输出,您甚至可以使用 ajax 通过 jquery 将转储传递到日志。
我想说的是……你把你想做的事情过度复杂化了。
仅来自 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 控制台需要一个插件