调试代码之 dd VS var_dump VS print_r ?

在浏览器中显示变量查找错误,是在 PHP 中最流行的调试方式之一。Laravel 为显示变量提供了 辅助函数 dd() ,这代表「Dump and Die」,我基本上都在用这个,可是时常也会觉得很不方便。

首先,我们先看看 dd() 有什么问题?比如我们想从 DB 表中获取内容并打印它们:

$comment = TicketComment::take(10)->all();
dd($comment);

然后你会先看到这个:

file

点击展开来:

file

再展开其中一个:

file

如果你想看到属性值(attributes)或者原始值(original)的时候,你还得在点击一次才能看到。没错,这个过程我们一共用鼠标点击了三次~

var_dump() and die()

传统 PHP 打印任何类型的数据是这样的:

$comment = TicketComment::take(10)->get();
var_dump($comment);
die();

显示出来是这样的:

file

可是这样的方法看上去并不是很直观,不是么?

print_r()

PHP 内置函数 print_r 的描述是「打印关于变量的易于理解的信息」,所以我们试一下这种:

$comment = TicketComment::take(10)->get();
print_r($comment);
die();

然后你看到的就会是这样
file

都挤在一堆了这怎么看呢?我的一个同事教我在程序中加入 echo "<pre>";

$comment = TicketComment::take(10)->get();
echo "<pre>";
print_r($comment);
die();

好让它看上去能这样:

file

但这样的方法,我还是很嫌弃。我尝试用过 Kint 来调试,但,其实也不怎么方便。

所以敢问大伙儿,你们平时都是怎么调试的?

Stay Hungry, Stay Foolish.
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 28

简单就 var_dump + exit/die
复杂就 PhpStorm + xdebug

6年前 评论

@MrJing sublime 重度使用病患怎么破:joy:

6年前 评论

想看什么数据就输出什么数据,这样一股脑都打印出来,用什么调试都不会方便的

dd($comment->toArray());

多好啊

6年前 评论
leo

打 Log 呀

6年前 评论
mouyong

@JokerLinly 琳姐的 sublime 常用的 package 有哪些啊?

6年前 评论

@蜗牛 终于有人问我这个问题了,你等着,我明天给你写一个

6年前 评论
mouyong

@JokerLinly 好的,给琳姐一个大大的赞 :+1:

6年前 评论

@JokerLinly :laughing:我也想知道~关于常用package

6年前 评论
dividez

转换成json 看吧

6年前 评论
66

print_r + die复杂的用xdebug

6年前 评论

@dividez 对还是json最直观,配合json格式化插件

6年前 评论

priny_r + 查看网页源代码
file

6年前 评论

期待你的 sublime package 推荐 ^_^

6年前 评论
mouyong

@JokerLinly 玲姐最棒了,O(∩_∩)O哈哈~:smile:

6年前 评论
mouyong

@JokerLinly 抱歉,好像一直打错

6年前 评论
dividez

@Insua var_dump() 以后,用 Chrome 右键 “查看源代码”,就可以看到非常整齐的对象/数组展开了。

6年前 评论
dividez

var_dump() 以后,用 Chrome 右键 “查看源代码”,就可以看到非常整齐的对象/数组展开了。

6年前 评论
awesee

刚学php时写了一个全局函数:

/**
 * [p 格式化打印数组/字符串]
 * @param  [type] $array [数组/字符串]
 * @return [type]        [description]
 */
function p($array = '')
{
    echo '<pre>' . print_r($array, true) . '</pre>';
    die();
}

排查问题,还是xdebug更好一点。

6年前 评论

@Openset
就是我上面写的这种哩~

file

6年前 评论
awesee

@JokerLinly 是的,写成函数调用方便。

6年前 评论

看你好几篇文章了,原来是个妹子。膜拜膜拜!

6年前 评论

哈哈;看来不止我一个懒人啊;
原本的 dump 打印一个模型是这样的;
file
大多时候我们只是想要看 name 和 email ;
结果给我们搞了这么一大堆属性;
于是我动手改造了个 扩展包 ;
https://github.com/baijunyao/laravel-print
安装 ;

composer require baijunyao/laravel-print

需要打印的时候使用 p($data) 代替 dump($data);
使用 pd($data) 代替 dd($data);
效果是这样的:

file

5年前 评论
ruke

xdebug大法好

5年前 评论
huaiqu

http://www.laruence.com/2010/06/21/1608.ht...
2010年 黑夜路人 曾经专门总结过《PHP调试技术手册》一文,冠以鸟哥之名。 算是个官方推荐吧。

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!