[php] 모범 사례 : 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의 차이점은 heredoc에 포함 된 PHP 코드가 실행되는 반면 Nowdoc의 PHP 코드는 그대로 인쇄된다는 것입니다.

$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."

작은 것들을 위해, 종종 연결된 문자열과 비교하여 배열 구조로 작업하는 것이 더 쉽다는 것을 알았습니다.

관련성 : 임 포드 대 연결 성능


답변

그것을 믿는 사람

"abc\n" . "def\n"

여러 줄 문자열이 잘못되었습니다. 여러 줄 문자열이 아닌 연결 연산자가있는 두 개의 문자열입니다. 이러한 연결된 문자열은 예를 들어 사전 정의 된 배열의 키로 사용될 수 없습니다. 불행히도 PHP는 실제 여러 줄 문자열을 제공하지 않습니다.

"abc\n"
"def\n"

전용 HEREDOCNOWDOC중첩 부호 등이 오목 구가 파손되기 때문에, 템플릿에 더 적합한 구문.