Лучшие практики: работа с длинными многострочными строками в PHP? - PullRequest
167 голосов
/ 04 декабря 2009

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

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

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.

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

Ответы [ 9 ]

263 голосов
/ 04 декабря 2009

Вы должны использовать 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; не должно быть пробелов или табуляций. в противном случае вы получите ошибку

43 голосов
/ 05 декабря 2009

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

24 голосов
/ 04 декабря 2009

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

email-template.txt содержит

hello {name}!
how are you? 

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

$email = file_get_contents('email-template.txt');
$email = str_replace('{name},', 'Simon', $email);
19 голосов
/ 04 декабря 2009

Добавление \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;

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

12 голосов
/ 04 декабря 2009

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

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

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

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

8 голосов
/ 13 апреля 2017

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

$var = "pizza";

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

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

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

Связано: взлет против производительности concat

1 голос
/ 15 марта 2014

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

"abc\n" . "def\n"

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

"abc\n"
"def\n"
Синтаксис

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

0 голосов
/ 11 сентября 2017

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

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

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

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

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

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

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

В конечном итоге Hello\n\nWorld должно привести к следующему выводу на экран:

Hello

     World

Где Hello\r\rWorld должно привести к следующего вывода .

Только при объединении двух символов \r\n у вас есть общее понимание известной строки. И.Е. Hello\r\nWorld должно привести к:

Hello
World

И, конечно, \n\r приведет к тому же визуальному выводу, что и \r\n.

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

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

0 голосов
/ 04 декабря 2009

Относительно вашего вопроса о переводе строки и возврате каретки:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...