PHP에서의 출력문은 대부분 echo를 사용한다.
printf가 있기는 하지만 가벼운 출력에서는 echo보다 느리기때문에 대부분은 echo를 사용하기 마련이다.
하지만 긴 문자열을 표시할때 사용하는 구문은 따로 있다.
이 글의 주인공인 heredoc과 nowdoc은 쓰임새가 거의 비슷하지만 서로 조금은 다르다.
일단 예제를 살펴보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <!doctype HTML> <html> <head> <title></title> </head> <body> <?php $test = <<<EOT PHP Test... EOT; echo $test; ?> </body> </html> | cs |
$test라는 변수에 히어닥을 적용했다.
결과는 'PHP Test...'가 띄워지게 된다.
EOT구문은 터미네이션 ID라고 하는데, 큰 의미는 없다. (EOF, EOT, EOL등 아무거나 써도 된다. 물론 AAA, Korean같이 의미없는 문장들로도 가능하다. 알아두자!)
heredoc은 저렇게 변수나 echo문 뒤에 <<<EOT 구문을 붙인 뒤
다음 행부터 내용을 인식한다. 당연히 <<<EOT 가 있는 첫행에 문자를 붙이면 오류를 먹는다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <!doctype HTML> <html> <head> <title></title> </head> <body> <?php $test = <<<EOT 안녕하세영 PHP Test... EOT; echo $test; ?> </body> </html> | cs |
<<<EOT 이후 줄바꿈을 반드시 해야하는데, 8행처럼 저렇게 글자를 넣어버리거나 한다면 당연히 오류를 먹게된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <!doctype HTML> <html> <head> <title></title> </head> <body> <?php $test = <<<EOT PHP Test... EOT; echo $test; ?> </body> </html> | cs |
이 코드는 초보들은 쉽게 알기 힘들다.
겉보기에는 별 문제가 없어보이지만,
10행에서 문제가 발생한 것이다.
document의 마지막 행에는 그 어떤것도 없이 오직 EOT; 라는 구문 하나만 존재해야 한다. 즉, 마지막 행은 EOT라는 터미널 아이디와 세미콜론( ; )으로만 이루어져야 한다는 뜻이다.
10행에는 이 규칙을 어긴 것으로 왼쪽에 Tab키, 또는 띄어쓰기가 껴있어서 오류가 발생했다.
하지만 nowdoc은 뭐고, 다른점이 무엇일까
heredoc은 문장에 변수를 넣고싶을때 사용된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <!doctype HTML> <html> <head> <title></title> </head> <body> <?php $val = '안녕'; $test = <<<EOT $val 하세여 EOT; echo $test; ?> </body> </html> | cs |
이번엔 $val이라는 변수가 추가되었다.
결과는 '안녕 하세여'로 출력된다.
heredoc은 이렇게 문장 안에 변수를 껴넣을 수 있다는 장점이 있다.
heredoc에서 변수를 무시하려면 앞에 역슬래쉬를 껴넣으면 된다.
\$val 이런식으로 하게되면 결과는
'$val 하세여' 가 된다.
1 2 3 4 5 6 7 8 9 10 11 12 | <html> <body> <?php $val = '안녕'; $test = <<<'EOT' $val 하세여 EOT; echo $test; ?> </body> </html> | cs |
이 코드는 언뜻보면 달라진게 없지만, nowdoc으로 변환한 코드다.
터미네이션 ID(EOT)를 따옴표로 감싸주면 nowdoc이 되는데,
저렇게 변수앞에 역슬래쉬를 껴넣지 않아도 변수명이 그대로 출력된다.
즉, 이번에도
변수를 사용하지 않는다면 howdoc보다는 nowdoc을 권장하며, echo로 노가다?를 하는 방식도 나쁘지 않지만 편하고 보기 좋게 하기위해선 이런 방식도 간과해서는 안될것이다.