【问题标题】:How to write own DD() function same as laravel?如何编写与 laravel 相同的自己的 DD() 函数?
【发布时间】:2017-05-30 20:52:42
【问题描述】:

我使用 laravel 很长一段时间,但目前我使用 wordpress。我喜欢使用 laravel 的 DD() 函数。 但是在wordpress中我只能使用这些,

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

这些都只是扩展整个数组对象。 但是我需要 laravel 的 expandclose 机制来处理数组和对象。 我使用以下作为一般 dd 需要,

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

效果很好,但我需要有样式且有条理的列表形式。

有可能吗?

【问题讨论】:

  • 为什么要重新发明轮子? packagist.org/packages/symfony/var-dumper
  • @RajenderJoshi 有时您需要橡胶轮胎而不是木头或石头制成的轮胎。 Laravel 仅将 varDumper 用于格式化 - 行为有点不同,因为在转储数据后不会停止执行。
  • @RajenderJoshi 在我的情况下,我需要 dd() 作为静态文件,而不是 Composer 包,否则旧应用程序会中断(因为它会多次调用自动加载器)

标签: php wordpress laravel var-dump


【解决方案1】:

Laravel 的 dd 使用 symfony 的 VarDump component。它提供了一个全局可用的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

var-dumpr 4.1 版之前:

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

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

var-dump 4.1 版之后:

自 var-dumper 4.1 版以来,dd() 已被声明。加载库就足够了。

【讨论】:

  • 最新的 VarDumper 版本已经默认添加了 dd 功能。您不必手动创建一个。
【解决方案2】:

我在debug functions包下面更新了d函数的更多函数和最新代码。

(以下答案大约是 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";
}

【讨论】:

    【解决方案3】:

    对于像 dd() 这样可能对 Laravel 感兴趣的其他人,请查看这个 repo -

    https://github.com/wanfeiyy/laravel-dd

    【讨论】:

    【解决方案4】:

    Laravel dd 实际上是一个很棒的功能。但是,接受机制是var_dump,然后是die

    例子:

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

    【讨论】:

    • 是的,你是对的。但是它的架构是什么。它不会详细说明整个数组。因为在某些情况下,数组可能太大了。在那种情况下,我们不能使用它。但是 laravel 做了一些事情来通过折叠来最小化这个问题。
    • 你可以设置var_dump()的深度。我不记得如何(我认为它可能在 php.ini 中)
    【解决方案5】:

    你可以在你的类use Illuminate\Support\Debug\Dumper; 中引入这个命名空间,然后将它用于你的变量,如下所示:

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

    【讨论】:

      【解决方案6】:

      composer 需要 --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);
                  }
              }
      
      ?>
      

      【讨论】:

        【解决方案7】:

        我是这样做的:

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

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

        我还使用var_masterpiece Chrome 扩展来获得一个不错的输出,我可以在其中展开和折叠数组键等。

        【讨论】:

          【解决方案8】:

          我喜欢这样:

          function dd($var){ 
              echo "<pre>";
              print_r($var);
              exit;
          }
          

          【讨论】:

          • 我有一个类似的功能,我只是稍微修改一下 echo '
            '.print_r($var,true).'
            ';退出;
          【解决方案9】:

          我大部分时间都在使用 laravel 框架,当涉及到调试 dd() 辅助方法时,它就成了一个非常少见的工具。

          但最近我被要求从事一个 symfony 3.4 项目,起初我使用 dump($my_vars); die(); 转储和删除我的 vars。但这很快就变得非常繁琐。所以我最终在 symfony 3.4 项目中添加了一个 dd() 全局辅助方法,方法如下:

          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);
              }
          }
          

          您可能需要将新文件 (helpers.php) 添加到您的 composer.json 文件中,以便自动为您加载,如下所示:

          composer.json

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

          【讨论】:

            【解决方案10】:

            @coloured-panda 答案不再有效。这是更新的代码:

            use Symfony\Component\VarDumper\VarDumper;
            
            if (! function_exists('dd')) {
                /**
                 * Dump the passed variables and end the script.
                 *
                 * @param  mixed  $vars
                 * @return void
                 */
                function dd(...$vars)
                {
                    header('Access-Control-Allow-Origin: *');
                    header('Access-Control-Allow-Methods: *');
                    header('Access-Control-Allow-Headers: *');
                    http_response_code(500);
            
                    foreach ($vars as $v) {
                        VarDumper::dump($v);
                    }
            
                    die(1);
                }
            }
            

            【讨论】:

              【解决方案11】:

              你可以使用包mp091689/dump-die然后你可以这样做:

              dd($variable);
              

              dd($variable1, $variable2, ..);
              

              【讨论】:

                【解决方案12】:

                它就像一个魅力。

                function dd()
                {
                   array_map(function($x) { var_dump($x); }, func_get_args()); die;
                }
                

                【讨论】:

                  【解决方案13】:

                  这是最简单的解决方案:

                  if(!function_exists('dd'))
                  {
                      function dd( $result )
                      {
                          echo '<pre>'; print_r($result); die();
                      }
                  }
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2011-02-22
                    • 2021-08-29
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-10-16
                    • 1970-01-01
                    相关资源
                    最近更新 更多