본문 바로가기

카테고리 없음

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로 노가다?를 하는 방식도 나쁘지 않지만 편하고 보기 좋게 하기위해선 이런 방식도 간과해서는 안될것이다.