[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"
전용 HEREDOC
및 NOWDOC
중첩 부호 등이 오목 구가 파손되기 때문에, 템플릿에 더 적합한 구문.