【问题标题】:What's the difference between two usages of <pre> tag?<pre> 标签的两种用法有什么区别?
【发布时间】:2017-12-08 15:36:17
【问题描述】:

考虑下面的代码:

<?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" } } } 

为什么&lt;pre&gt; 标记的两种不同用法会得到两种不同的输出?

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

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

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

【问题讨论】:

  • '&lt;/pre&gt;';完全什么都不做。你可以换成'&lt;/bla&gt;'; 或者只是'bla';,都是一样的。它是一个在PHP代码中丢失的字符串,一个没有任何作用的表达式。

标签: php html output echo pre


【解决方案1】:

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

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

你会得到输出

你好

这是因为函数被评估为构建回声调用输出的一部分。如果函数本身有echo 语句(或var_dumpprint_r 等),则会首先显示。

有两种方法可以解决这个问题:

1) 重构您的函数以返回字符串

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

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

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

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

你好阿

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

【讨论】:

    【解决方案2】:

    echo 输出到 STDOUT。 var_dump 输出到STDOUT

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

    输出 &lt;pre&gt;

    然后它输出 var_dump。

    然后它在空中挥舞着字符串文字&lt;/pre&gt;,什么也不做。


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

    这开始构建一个字符串。

    &lt;pre&gt;开头。

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

    然后它将&lt;/pre&gt; 加入到字符串中。

    最后输出字符串 (&lt;pre&gt;&lt;/pre&gt;)

    【讨论】:

    • '&lt;/pre&gt;';声明效果的出色解释:-)
    猜你喜欢
    • 2013-04-10
    • 2022-12-04
    • 2014-07-16
    • 1970-01-01
    • 2013-09-08
    • 2019-03-31
    • 2020-01-22
    • 1970-01-01
    相关资源
    最近更新 更多