<pre> 标签的两种用法有什么区别?

What's the difference between two usages of <pre> tag?

考虑以下代码:

<?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>';

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

echo 仅 运行s 一旦完成构建字符串。所以如果你 运行

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

你最终会得到输出

AHello

这是因为该函数是作为构建回显调用输出的一部分进行评估的。如果函数本身有 echo 语句(或 var_dumpprint_r 等),那么它将首先显示。

有两个选项可以解决这个问题:

1) 将您的函数重构为 return 字符串而不是

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

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

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

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

Hello A

特别针对您的问题,您看到的输出是 var_dump 的输出,后跟 <pre></pre>,它根本不会显示。 (或者实际上,正如现在许多人提到的那样,只是 <pre>。尽管这不会对行为产生太大影响。)

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

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

这个输出<pre>

然后它输出 var_dump。

然后它在空中挥动字符串文字 </pre>,什么也不做。


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

这将开始构建字符串。

<pre>开头。

然后输出var_dump的结果,并加入return值a 函数(没有 return 语句)到字符串。

然后它将 </pre> 连接到字符串。

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