PHP) 출력문 here document, Nowdoc에 대해 (EOL, EOT, EOL)
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이 되는데,
저렇게 변수앞에 역슬래쉬를 껴넣지 않아도 변수명이 그대로 출력된다.
즉, 이번에도
'$val 하세여' 가 된다.
변수를 사용하지 않는다면 howdoc보다는 nowdoc을 권장하며, echo로 노가다?를 하는 방식도 나쁘지 않지만 편하고 보기 좋게 하기위해선 이런 방식도 간과해서는 안될것이다.
출처: https://itun.tistory.com/329 [Bino]