Рекомендации: работа с длинными многострочными строками в PHP?

Примечание: извините, если это очень простой вопрос, но я несколько навязчиво навязчив по форматированию моего кода.

у меня есть класс, который имеет функцию, которая возвращает строку, которая будет составлять текст по электронной почте. Я хочу, чтобы этот текст был отформатирован так, чтобы он выглядел правильно в письме, но также и чтобы мой код не выглядел фанком. Вот что я имею в виду:

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},nrThe second line starts two lines below.nrI also don't want any spaces before the new line, so it's butted up against the left side of the screen.";
    return $text;
}

но в чем же дело новые линии и возврат каретки? Какая разница? Is nn в эквиваленте rr или nr? Что я должен использовать, когда создаю разрыв между линиями?

тогда есть возможность буферизации вывода и синтаксиса heredoc.

как вы справляетесь с помощью длинных многострочных строк в ваших объектах?

9 ответов


вы должны использовать HEREDOC или NOWDOC.

$var = "some text";
$text = <<<EOT
  Place your text between the EOT. It's
  the delimiter that ends the text
  of your multiline string.
  $var
EOT;

разница между Heredoc и Nowdoc заключается в том, что PHP-код, встроенный в heredoc, выполняется, а PHP-код в Nowdoc будет распечатан как есть.

$var = "foo";
$text = <<<'EOT'
  My $var
EOT;

в этом случае $text будет иметь значение My $var.

Примечание: перед закрывающим тегом EOT; не должно быть никаких пробелов или знаков табуляции. в противном случае вы получите сообщение об ошибке


Я использую аналогичную систему как 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.


Я использую шаблоны для длинного текста:

email-шаблон.txt содержит

hello {name}!
how are you? 

в PHP я делаю это:

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

добавлять \n и/или \r в середине строки, и очень длинный код, как во втором примере, не так : когда вы читаете код, вы не видите результат, и вы должны прокрутить.

в таких ситуациях я всегда использую Heredoc (или Nowdoc, если используется PHP >= 5.3): легко писать, легко читать, нет необходимости в сверхдлинных строках ...

например :

$var = 'World';
$str = <<<MARKER
this is a very
long string that
doesn't require
horizontal scrolling, 
and interpolates variables :
Hello, $var!
MARKER;

только одна вещь: маркер конца (и '; ' после него) должно быть единственное, что на его линии: нет пробела / вкладки до или после !


конечно, вы можете использовать HEREDOC, но насколько читаемость кода идет, это не лучше, чем в первом примере, обертывание строки через несколько строк.

Если вы действительно хотите, чтобы ваша многострочная строка выглядела хорошо и хорошо текла с вашим кодом, я бы рекомендовал объединить строки вместе как таковые:

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

Это может быть немного медленнее, чем HEREDOC или многострочная строка, но это будет хорошо сочетаться с отступом вашего кода и облегчит читать.


Мне нравится этот метод немного больше для Javascript, но, кажется, стоит включить здесь, потому что он еще не упоминался.

$var = "pizza";

$text = implode(" ", [
  "I love me some",
  "really large",
  $var,
  "pies.",
]);

// "I love me some really large pizza pies."

для небольших вещей я нахожу, что часто легче работать со структурами массивов по сравнению с Объединенными строками.

по теме: implode vs concat performance


а что там с новой строки и возврата каретки? Какая разница? Это \н\н эквивалент \Р\R или \н\р? Что я должен использовать, когда создаю разрыв между линиями?

никто здесь, казалось, на самом деле не ответил на этот вопрос, поэтому я здесь.

\r представляет 'возврат каретки'

\n представляет 'line-feed'

фактическая причина для них восходит к машинки. Как вы набрали "карета" медленно скользила слева от пишущей машинки, символ за символом. Когда вы доберетесь до конца линии, вы будете возврат каретки а то перейти к новой строке. Чтобы перейти к новой линии, вы бы перевернуть рычаг, который Фед строки к пишущему типу. Таким образом, эти действия, вместе взятые, были названы возврат каретки перевод строки. Так что буквально:

подающем трубопроводе,\n, означает переход к следующей линия.

возврат каретки, \r, значит, перемещение курсора в начало строки.

так \n\n нет, не \r\r. \n\r Я думаю, но \r\n наиболее распространен. Теперь перейдем к компьютерам. Оригинальные компьютеры взяли \r и \n в буквальном смысле.

таким образом, вы можете писать поверх символов, которые уже были написаны. Г. Е. Hello\rWorld посмотрел бы очень странно действительно. Hello\nWorld с другой стороны, будет также выглядеть немного странно...

однако в эти дни поддержка возврата перевозки разрежена. Обычно в каждой системе вы можете уйти с помощью \n самостоятельно. Это никогда не зависит от ОС, но это зависит от того, что вы просматриваете вывод.

все же я бы всегда советовал использовать \r\n везде, где можно!


тот, кто верит в это

"abc\n" . "def\n"

многострочная строка неверна. Вот две строки с оператором конкатенации строк, а не строк. Например, такие сцепленные строки нельзя использовать в качестве ключей предопределенных массивов. К сожалению, php не предлагает реальных многострочных строк в виде

"abc\n"
"def\n"

только HEREDOC и NOWDOC синтаксис, который больше подходит для шаблонов, потому что вложенный отступ кода нарушается таким синтаксисом.


Что касается вашего вопроса о новых линиях и возвратах каретки:

Я бы рекомендовал использовать предопределенную глобальную константу PHP_EOL поскольку это решит любые проблемы кросс-платформенной совместимости.

этот вопрос был поднят на SO заранее, и вы можете узнать больше информации, прочитав"когда я использую константу PHP PHP_EOL"