代码之家  ›  专栏  ›  技术社区  ›  user9059272

标签的两种用法有什么不同?

  •  1
  • user9059272  · 技术社区  · 7 年前

    考虑以下代码:

    <?php
    function a($txt) {
        b("Cleveland");
    }
    function b($txt) {
        var_dump(debug_backtrace());
    }
    echo '<pre>';
    a("Peter");
    '</pre>';
    ?>
    

    输出:

    array(2) {
      [0]=>
      array(4) {
        ["file"]=>
        string(40) "C:\xampp\htdocs\php_playground\hello.php"
        ["line"]=>
        int(6)
        ["function"]=>
        string(1) "b"
        ["args"]=>
        array(1) {
          [0]=>
          string(9) "Cleveland"
        }
      }
      [1]=>
      array(4) {
        ["file"]=>
        string(40) "C:\xampp\htdocs\php_playground\hello.php"
        ["line"]=>
        int(12)
        ["function"]=>
        string(1) "a"
        ["args"]=>
        array(1) {
          [0]=>
          string(5) "Peter"
        }
      }
    }
    

    现在,考虑以下代码:

    <?php
    function a($txt) {
        b("Cleveland");
    }
    function b($txt) {
        var_dump(debug_backtrace());
    }
    echo '<pre>'.a("Peter").'</pre>';
    ?>
    

    输出:

    array(2) { [0]=> array(4) { ["file"]=> string(40) "C:\xampp\htdocs\php_playground\hello.php" ["line"]=> int(3) ["function"]=> string(1) "b" ["args"]=> array(1) { [0]=> string(9) "Cleveland" } } [1]=> array(4) { ["file"]=> string(40) "C:\xampp\htdocs\php_playground\hello.php" ["line"]=> int(8) ["function"]=> string(1) "a" ["args"]=> array(1) { [0]=> string(5) "Peter" } } } 
    

    为什么我得到两种不同的输出,用于两种不同的 <pre> 标签

    echo '<pre>';
    a("Peter");
    '</pre>';
    

    以及

    echo '<pre>'.a("Peter").'</pre>';
    

    我认为我在这两个声明中没有做什么不同。我在做几乎相同的事情,那么为什么我会得到不同的输出?

    2 回复  |  直到 7 年前
        1
  •  2
  •   iainn    7 年前

    echo 仅在完成构建字符串后运行。所以如果你跑步

    function a() {
      echo 'A';
    }
    echo 'Hello ' . a();
    

    您将得到输出

    阿赫洛

    这是因为函数是作为构建echo调用输出的一部分进行评估的。如果函数本身具有 回响 声明(或 var_dump , print_r ,然后将首先显示。

    有两种解决方法:

    1) 重构函数以 回来 而不是字符串

    function a() {
      return 'A';
    }
    echo 'Hello ' . a();
    

    2) 在单独的回显调用中调用函数,使用逗号而不是字符串连接:

    function a() {
      echo 'A';
    }
    echo 'Hello ' , a();
    

    在这两种情况下,最终都会得到正确的输出:

    你好A

    特别是对于你的问题,你看到的输出是 var_转储 ,后跟 <pre></pre> ,它根本不会出现。(或者实际上,正如许多人现在提到的那样 <pre> . 尽管这对行为没有多大影响。)

        2
  •  1
  •   Quentin    7 年前

    echo 输出到标准输出。 var_dump 输出到 STDOUT .

    echo '<pre>';
    a("Peter");
    '</pre>';
    

    输出 <pre> .

    然后它 输出 var_转储。

    然后它波动字符串文字 </pre> 在空中无所事事。


    echo '<pre>'.a("Peter").'</pre>';
    

    这将开始构建字符串。

    它开始于 <pre> .

    然后它 输出 结果 var_转储 、和连接 返回值 a 函数(没有 return 语句)到字符串。

    然后它加入 </pre> 到字符串。

    最后 输出 字符串( <pre></pre> )