如何编写自己的DD()函数,与Laravel相同?

28

我曾长时间使用laravel,但目前我使用wordpress。我喜欢使用laravel的DD()函数。 但在wordpress中,我只能使用以下函数,

   print_r(),
   var_dump(),
   var_export()....

这些都只是展开整个数组对象。但我需要laravel的展开关闭机制来处理数组和对象。我使用以下作为通用的dd需求,

if (!function_exists('dd')) {
 function dd()
  {
      echo '<pre>';
      array_map(function($x) {var_dump($x);}, func_get_args());
      die;
   }
 }

它的功能很好,但我需要一种有样式和组织的列表形式。

这是否可能?


4
为什么要重复造轮子?https://packagist.org/packages/symfony/var-dumper - Rajender Joshi
2
@RajenderJoshi 有时候你想要一条橡胶轮胎而不是木头或石头做的。Laravel仅使用varDumper进行格式化 - 行为有点不同,因为在转储数据后执行不会停止。 - Coloured Panda
在我的情况下,我需要将dd()作为静态文件而不是Composer包,因为遗留应用程序否则会破坏(因为它会多次调用自动加载程序)。 - Sliq
16个回答

41

Laravel的dd使用symfony的VarDump组件。它提供了一个全局可用的dump函数来格式化输出。唯一的区别是,它不会在转储后“死亡”,您需要手动执行这个操作 - 但在大多数情况下,您甚至不想要这样做。

  1. 运行composer global require symfony/var-dumper(假设您的WordPress项目中已经安装了composer)
  2. auto_prepend_file = ${HOME}/.composer/vendor/autoload.php添加到php.ini文件中;
  3. 定期运行composer global update symfony/var-dumper以获取最新的错误修复。

这里是VarDumper组件的文档。https://symfony.com/doc/current/components/var_dumper.html

symfony/var-dumper版本 >= 4.1:

自var-dumper 4.1版本起,dd()已经声明。只需加载库即可。


symfony/var-dumper版本 <= 4.0:

声明一个dd函数,转储所有参数并停止进程:

if (!function_exists('dd')) {
    function dd()
    {
        foreach (func_get_args() as $x) {
            dump($x);
        }
        die;
    }
 }

1
最新的VarDumper版本已经默认添加了dd函数。您不必手动创建一个。 - M_R_K

23

我更新了更多的功能和最新的代码,包括 d 函数,放在debug functions 包中。

(以下答案大约是1年前的。)

======================================

以下是我的原始代码,它可以在普通 PHP (没有框架)中运行。

function d($data){
    if(is_null($data)){
        $str = "<i>NULL</i>";
    }elseif($data == ""){
        $str = "<i>Empty</i>";
    }elseif(is_array($data)){
        if(count($data) == 0){
            $str = "<i>Empty array.</i>";
        }else{
            $str = "<table style=\"border-bottom:0px solid #000;\" cellpadding=\"0\" cellspacing=\"0\">";
            foreach ($data as $key => $value) {
                $str .= "<tr><td style=\"background-color:#008B8B; color:#FFF;border:1px solid #000;\">" . $key . "</td><td style=\"border:1px solid #000;\">" . d($value) . "</td></tr>";
            }
            $str .= "</table>";
        }
    }elseif(is_resource($data)){
        while($arr = mysql_fetch_array($data)){
            $data_array[] = $arr;
        }
        $str = d($data_array);
    }elseif(is_object($data)){
        $str = d(get_object_vars($data));
    }elseif(is_bool($data)){
        $str = "<i>" . ($data ? "True" : "False") . "</i>";
    }else{
        $str = $data;
        $str = preg_replace("/\n/", "<br>\n", $str);
    }
    return $str;
}

function dnl($data){
    echo d($data) . "<br>\n";
}

function dd($data){
    echo dnl($data);
    exit;
}

function ddt($message = ""){
    echo "[" . date("Y/m/d H:i:s") . "]" . $message . "<br>\n";
}

6

2
如果你观察那个库的源代码,就会发现使用原始Symphony组件来复制它实际上相当简单。所有逻辑似乎都在这个文件中,并且很容易复制:https://github.com/wanfeiyy/laravel-dd/blob/master/src/Dd/Dumper.php - Fran Cano

5

Laravel的dd函数是非常好的。然而,其实现机制是先进行var_dump再执行die

示例:

$arr = [1,2,3,4,5,6];
var_dump($arr);
die();

是的,你说得对。但是它的模式怎么样呢?它不会详细说明整个数组。因为在某些情况下,数组可能太大了。在这种情况下,我们无法使用它。但是Laravel会通过折叠来最小化这个问题。 - Shankar Thiyagaraajan
你可以设置 var_dump() 的深度,但我不记得具体怎么设置了(我觉得可能在 php.ini 文件中)。 - robertmain

5

composer require --dev symfony/var-dumper

<?php     
if (! function_exists('dd')) {
            /**
             * Dump the passed variables and end the script.
             *
             * @param  mixed
             * @return void
             */
            function dd()
            {
                array_map(function ($value) {
                    if (class_exists(Symfony\Component\VarDumper\Dumper\CliDumper::class)) {
                        $dumper = 'cli' === PHP_SAPI ?
                            new Symfony\Component\VarDumper\Dumper\CliDumper :
                            new Symfony\Component\VarDumper\Dumper\HtmlDumper;
                        $dumper->dump((new Symfony\Component\VarDumper\Cloner\VarCloner)->cloneVar($value));
                    } else {
                        var_dump($value);
                    }
                }, func_get_args());
                die(1);
            }
        }

?>

3
它像魔法一样运行良好。
function dd()
{
   array_map(function($x) { var_dump($x); }, func_get_args()); die;
}

3

您可以在类中引入此命名空间use Illuminate\Support\Debug\Dumper;,然后像这样使用它来处理变量:

(new Dumper)->dump($myVariable);

2
我喜欢这样做:
function dd($var){ 
    echo "<pre>";
    print_r($var);
    exit;
}

2
我有一个类似的函数,只需要稍微修改一下就可以变成:echo '<pre>'.print_r($var,true).'</pre>'; exit; - Oliver M Grech

2
我会这样做:

我是这样做的:

function dd($a){
    var_dump($a);
    exit;
}

我一直在使用它。甚至在Sublime中为其创建了一个代码片段。

我还使用var_masterpiece Chrome扩展程序以获得漂亮的输出,其中我可以展开和折叠数组键等。


1
大多数时候我使用 laravel 框架,当需要调试时,dd() 辅助方法是一个非常有用的工具。
但最近,我被要求在 symfony 3.4 项目上工作。起初,我使用 dump($my_vars); die(); 来转储和终止我的变量。但很快就变得非常麻烦。所以,最终我添加了一个全局辅助方法dd()到 symfony 3.4 项目中,以下是方法:
src/ 文件夹内,我创建了 Support/ 文件夹,在 Support/ 文件夹内,我创建了 helpers.php 文件,并添加了我的转储辅助函数。

src/Support/helpers.php

if (!function_exists('dd')) {

    /**
     * Dump the passed variables and end the script.
     *
     * @return void
     */
    function dd() {

        $args = func_get_args();

        call_user_func_array('dump', $args);

        die(1);
    }
}

You may need to add the new file (helpers.php) to your composer.json file to be loaded for you automatically, like this:

composer.json

{
    ...

    "autoload": {
        "psr-4": {
            "App\\": "src/"
        },
        "files": [
            "src/Support/helpers.php"
        ]
    },

    ...
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接