프로그램개발/ServerSide(PHP,Node.js)

PHP) 출력문 here document, Nowdoc에 대해 (EOL, EOT, EOL)

크레도스 2020. 7. 13. 09:39

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]