Лучшие практики: работа с длинными многострочными строками в 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},\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 ? Что я должен использовать, когда создаю разрыв строк между строками?

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

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

Вы должны использовать 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-template.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." 

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

Связанный: impode vs concat performance

Тот, кто считает, что

 "abc\n" . "def\n" 

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

 "abc\n" "def\n" 

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

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

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

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

но какова сделка с новыми линиями и возвратом каретки? Какая разница? Является ли \ n \ n эквивалентом \ r \ r или \ n \ r? Что я должен использовать, когда создаю разрыв строк между строками?

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

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

\n представляет строку "line-feed"

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

Линейный канал, \n , означает переход к следующей строке.

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

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

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

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

Тем не менее я всегда советовал использовать везде, где только можно!