Menu

PHP heredoc과 nowdoc: 여러 줄 문자열 작성법

PHP heredoc은 <<<EOT로 시작해 EOT로 끝나는 여러 줄 문자열이며, 큰따옴표 문자열처럼 변수를 치환합니다. nowdoc(<<<'EOT')은 텍스트를 적힌 그대로 유지합니다. 문법, 들여쓰기 규칙, 배열과 객체 보간, HTML 템플릿을 배웁니다.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

heredoc은 여러 줄 문자열입니다. <<<EOT로 시작하고, 다음 줄부터 텍스트를 쓰고, 별도의 줄에 EOT;로 끝냅니다. 안의 변수는 큰따옴표 문자열처럼 치환됩니다.

식별자(여기서는 EOT)는 문자나 밑줄로 시작하고 그 뒤에 문자, 숫자, 밑줄이 옵니다. 보통 텍스트가 무엇인지 알려 주는 이름을 고릅니다: HTML, SQL, TEXT. PhpStorm을 비롯한 일부 에디터는 이름이 HTML이나 SQL이면 본문을 그 언어로 하이라이트합니다.

heredoc으로 HTML 템플릿 만들기

heredoc은 값이 들어간 HTML 블록을 쓰는 가장 명확한 방법입니다. 마크업이 모양을 유지하고 아무것도 이스케이프할 필요가 없기 때문입니다. 출력이 HTML이므로 에디터는 Page 탭에 보여 줍니다.

이 블록의 두 가지 세부 사항: 배열 요소는 중괄호로 감쌌고({$product['name']}), 가격 앞의 달러 기호 문자는 \$로 이스케이프했습니다. 이름을 바꾸거나 태그를 추가하고 다시 실행해 보세요.

사용자에게서 온 값은 HTML에 넣기 전에 이스케이프해야 합니다. 이유와 방법은 htmlspecialchars를 보세요.

nowdoc: 보간 없는 텍스트

nowdoc은 식별자를 작은따옴표로 감쌉니다: <<<'EOT'. 안의 아무것도 치환되지 않으므로 달러 기호와 백슬래시가 적힌 그대로 남습니다. 코드 예제, 정규 표현식, $가 들어 있는 모든 텍스트에 쓰세요.

닫는 표식 들여쓰기

PHP 7.3부터 닫는 표식을 들여쓸 수 있으며, 그 들여쓰기만큼 본문의 모든 줄에서 제거됩니다. 그래서 함수나 if 안의 heredoc이 문자열에 공백을 남기지 않고 코드의 들여쓰기를 따를 수 있습니다.

json_encode 줄은 결과를 문자 하나하나까지 보여 줍니다. 닫는 TEXT;가 8칸 들여쓰기되어 있으므로 각 줄에서 공백 8개가 제거되었습니다.

닫는 표식보다 덜 들여쓴 본문 줄은 구문 에러입니다.

$html = <<<HTML
  <p>Hello</p>
    HTML;
PHP Parse error:  Invalid body indentation level (expecting an indentation level of at least 4) in /home/index.php on line 3

heredoc 안의 배열, 객체, 메서드 호출

heredoc은 큰따옴표와 같은 규칙을 따릅니다. 단순한 변수는 그대로 동작하고, 따옴표로 감싼 배열 키, 중첩 배열, 속성, 메서드 호출에는 중괄호를 쓰세요.

함수 인자로 heredoc 사용

PHP 7.3부터 닫는 표식 뒤 같은 줄에 코드를 더 쓸 수 있으므로, heredoc을 함수에 바로 넘기거나 배열에 넣을 수 있습니다. sprintf와 함께 쓰면 자리표시자를 나중에 채우는 템플릿이 됩니다.

흔한 실수: 세미콜론 누락이나 표식 뒤의 불필요한 텍스트

닫는 식별자는 연 것과 정확히 같게(대소문자까지) 써야 하며, 같은 줄에서 그 뒤에 오는 것은 PHP로서 말이 되어야 합니다. EOT;는 문장을 끝내고, EOT,는 인자 목록을 이어 갑니다. 표식 바로 뒤에 문자나 숫자가 붙으면(EOTX;) 표식이 인식되지 않아 문자열이 파일 끝까지 이어지고, PHP는 syntax error, unexpected end of file을 보고합니다. 반대의 함정은 본문 줄이 식별자 뒤에 공백이나 구두점이 오는 형태로 시작하는 경우입니다. 예를 들어 EOT is the marker는 문자열을 일찍 끝내고, 그 줄의 나머지를 PHP로 읽습니다(syntax error, unexpected identifier "is"). 마크업에는 HTML, 쿼리에는 SQL처럼 텍스트의 줄 맨 앞에 나오지 않는 식별자를 고르세요.

자주 묻는 질문

PHP의 heredoc이란 무엇인가요?

따옴표 없이 여러 줄 문자열을 쓰는 방법입니다. <<<EOT와 줄바꿈으로 시작해 텍스트를 쓰고, 별도의 줄에 EOT;로 끝냅니다. 안의 변수는 큰따옴표 문자열과 똑같이 치환되며, "와 '를 자유롭게 쓸 수 있습니다.

heredoc과 nowdoc의 차이는 무엇인가요?

heredoc(<<<EOT)은 큰따옴표 문자열처럼 변수와 이스케이프 시퀀스를 치환합니다. nowdoc(<<<'EOT', 식별자를 작은따옴표로 감쌈)은 둘 다 하지 않고 모든 $와 백슬래시를 적힌 그대로 유지하며, 작은따옴표 문자열과 같습니다.

heredoc의 닫는 표식을 들여쓸 수 있나요?

네, PHP 7.3부터 가능합니다. 닫는 표식의 들여쓰기만큼 본문의 모든 줄에서 제거되므로, 코드에 맞춰 heredoc을 들여쓸 수 있습니다. 본문의 모든 줄은 닫는 표식 이상으로 들여써야 하며, 그렇지 않으면 PHP가 구문 에러로 멈춥니다.

heredoc 안에서 함수를 호출하려면 어떻게 하나요?

heredoc은 변수, 배열 요소, 속성, 메서드 호출만 보간합니다. 먼저 함수를 호출해 결과를 저장하거나, 함수 이름이나 클로저를 변수에 담아 중괄호 안에서 호출하세요: $e = 'htmlspecialchars'; 다음 {$e($text)}.

Coddy 프로그래밍 언어 일러스트

Coddy로 코딩 배우기

시작하기