Рекомендации: работа с длинными многострочными строками в 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"