最佳实践:在PHP中使用长的多行字符串?

最佳实践:在PHP中使用长的多行字符串?,php,string,Php,String,注意:如果这是一个非常简单的问题,我很抱歉,但我对代码的格式有点强迫性 我有一个类,它有一个返回字符串的函数,该字符串将构成电子邮件的正文。我希望这个文本的格式,使它看起来正确的电子邮件,但也使我的代码看起来不时髦。我的意思是: class Something { public function getEmailText($vars) { $text = 'Hello ' . $vars->name . ", The second line starts

注意:如果这是一个非常简单的问题,我很抱歉,但我对代码的格式有点强迫性

我有一个类,它有一个返回字符串的函数,该字符串将构成电子邮件的正文。我希望这个文本的格式,使它看起来正确的电子邮件,但也使我的代码看起来不时髦。我的意思是:

class Something
{
    public function getEmailText($vars)
    {
        $text = 'Hello ' . $vars->name . ",

The second line starts two lines below.

I also don't want any spaces before the new line, so it's butted up against the left side of the screen.";
        return $text;
    }
}
但也可以写成:

public function getEmailText($vars)
{
    $text = "Hello {$vars->name},\n\rThe second line starts two lines below.\n\rI also don't want any spaces before the new line, so it's butted up against the left side of the screen.";
    return $text;
}
但是,新的线路和运输返回怎么办?有什么区别?
\n\n
是否等同于
\r\r
\n\r
?在创建线之间的线间距时,应该使用哪种方法

还有输出缓冲和herdoc语法选项

如何处理在对象中使用长多行字符串的问题?

您应该使用或

在这种情况下,
$text
将具有值
“My$var”
,而不是
“My foo”

注意事项:

  • 关闭前<代码>EOT不应该有空格或制表符。否则您将得到一个错误

  • 包含文本的字符串/标记(<代码> EOT < /代码>)是任意的,也就是说,可以使用其他字符串,例如“代码> > p>在字符串的中间添加<代码> \n>代码>和/或<代码> \r>代码,并且具有非常长的代码行,如在第二示例中,感觉不正确:当您读取代码时,看不到结果,你必须滚动

    在这种情况下,我总是使用herdoc(如果使用PHP>=5.3,则使用Nowdoc):易于编写,易于阅读,不需要超长的行

    例如:

    $var = 'World';
    $str = <<<MARKER
    this is a very
    long string that
    doesn't require
    horizontal scrolling, 
    and interpolates variables :
    Hello, $var!
    MARKER;
    
    $var='World';
    
    $str=我对长文本使用模板:

    email-template.txt包含

    hello {name}!
    how are you? 
    
    在PHP中,我这样做:

    $email = file_get_contents('email-template.txt');
    $email = str_replace('{name},', 'Simon', $email);
    

    关于您关于换乘和换乘返回的问题:

    我建议使用预定义的全局常量PHP\u EOL,因为它将解决任何跨平台兼容性问题


    这个问题已经提前提出了,您可以通过阅读“

    了解更多信息。当然,您可以使用herdoc,但就代码可读性而言,它实际上并不比第一个示例更好,它将字符串包装成多行

    如果您真的希望多行字符串看起来很好,并且与代码配合得很好,我建议将字符串连接在一起,如下所示:

    $text = "Hello, {$vars->name},\r\n\r\n"
        . "The second line starts two lines below.\r\n"
        . ".. Third line... etc";
    

    这可能比herdoc或多行字符串稍慢,但它将与代码的缩进配合良好,并使其更易于阅读。

    我使用与pix0r类似的系统,我认为这使代码非常可读。有时我甚至会用双引号分隔换行符,并对字符串的其余部分使用单引号。这样,如果使用串联而不是将它们插入双引号字符串中,它们将从文本的其余部分中脱颖而出,并且变量也会更好地脱颖而出。所以我可以用你最初的例子做这样的事情:

    $text = 'Hello ' . $vars->name . ','
          . "\r\n\r\n"
          . 'The second line starts two lines below.'
          . "\r\n\r\n"
          . 'I also don\'t want any spaces before the new line,'
          . ' so it\'s butted up against the left side of the screen.';
    
    return $text;
    

    关于换行符,对于电子邮件,您应该始终使用\r\n。PHP_EOL是用于在运行PHP的同一操作系统中使用的文件。

    相信这一点的人

    "abc\n" . "def\n"
    
    是多行字符串错误。这是两个带有连接运算符的字符串,而不是多行字符串。例如,这样的连接字符串不能用作预定义数组的键。不幸的是,php并没有以字符串的形式提供真正的多行字符串

    "abc\n"
    "def\n"
    

    只有
    herdoc
    NOWDOC
    语法更适合模板,因为嵌套的代码缩进被这种语法打破了。

    对于Javascript,我更喜欢这种方法,但它似乎值得包含在这里,因为它还没有被提及

    $var = "pizza";
    
    $text = implode(" ", [
      "I love me some",
      "really large",
      $var,
      "pies.",
    ]);
    
    // "I love me some really large pizza pies."
    
    对于较小的内容,我发现与串联字符串相比,使用数组结构通常更容易

    相关的:

    但是,新的线路和运输返回怎么办?有什么区别?\n\n是否等同于\r\r或\n\r?在创建线之间的线间距时,应该使用哪种方法

    这里似乎没有人真正回答这个问题,所以我来了

    \r
    表示“回车”

    \n
    表示“换行”

    真正的原因要追溯到打字机。当你打字时,“回车”会一个字符一个字符地慢慢滑到打字机的右边。当你到达终点时,你将返回车厢,然后转到新的一行。要转到新行,您需要翻转一个杠杆,将行输入打字机。因此,这些动作组合在一起称为回车线进给。从字面上说:

    换行符,
    \n
    ,表示移动到下一行

    回车符
    \r
    表示将光标移动到行首

    最终,
    Hello\n\nWorld
    将在屏幕上显示以下输出:

    Hello
    
         World
    
    其中as
    Hello\r\rWorld
    应导致

    只有在组合这两个字符时,您才能对已知行有共同的理解。例如,
    Hello\r\nWorld
    应导致:

    Hello
    World
    
    当然,
    \n\r
    将产生与
    \r\n
    相同的视觉输出

    最初,计算机从字面上理解为
    \r
    \n
    。然而,如今对马车返回的支持很少。通常在每个系统上,您都可以单独使用
    \n
    。它永远不取决于操作系统,但它确实取决于您在其中查看输出的内容

    不过我还是建议您尽可能地使用
    \r\n

    您还可以使用:

    <?php
    ob_start();
    echo "some text";
    echo "\n";
    
    // you can also use: 
    ?> 
    some text can be also written here, or maybe HTML:
    <div>whatever<\div>
    <?php
    echo "you can basically write whatever you want";
    // and then: 
    $long_text = ob_get_clean();
    
    
    
    一些文本也可以写在这里,也可以是HTML:
    无论什么
    
    我一直认为\n是Unix中的新行\r是OS/X之前MacOS上的新行,\r\n是Windows上的新行。另外,考虑到这将是一个
    Hello
    World
    
    <?php
    ob_start();
    echo "some text";
    echo "\n";
    
    // you can also use: 
    ?> 
    some text can be also written here, or maybe HTML:
    <div>whatever<\div>
    <?php
    echo "you can basically write whatever you want";
    // and then: 
    $long_text = ob_get_clean();