PHP 기본 문법
PHP 기본 문법 (Basic syntax)
PHP 공식 매뉴얼(Language Reference · Basic syntax) -
language.basic-syntax문서의 한국어 번역.
PHP 파일을 처음 열어 보면, HTML 사이에 <?php ... ?>가 눈에 띄죠. 이 장에서는 PHP가 파일을 어떻게 읽고, 코드의 경계를 어떻게 정하고, 문장을 어떻게 구분하며 주석을 다는지를 하나씩 살펴볼게요. 기본 문법은 네 가지 주제로 나뉘어요 — PHP 태그, HTML에서 빠져나오기, 명령 구분, 주석.
PHP 태그
PHP가 파일을 처리할 때, 여는 태그와 닫는 태그(<?php와 ?>)를 인식해서 PHP 코드가 실행되는 경계를 정해요. 이 태그 밖에 있는 내용은 PHP 파서가 무시해요. 덕분에 PHP를 HTML 같은 다양한 문서 형식에 자연스럽게 끼워 넣을 수 있죠.
<?php 다음에는 반드시 공백 문자가 와야 해요(스페이스, 탭, 개행 중 하나). 이 공백이 있어야 토큰이 제대로 분리되거든요. 공백이 빠지면 문법 오류가 나요.
PHP에는 짧은 echo 태그 <?=도 있어요. <?php echo의 줄임 표현이죠.
예제 #1 — PHP 여는/닫는 태그
<?php echo 'if you want to serve PHP code in XHTML or XML documents,
use these tags'; ?>
You can use the short echo tag to <?= 'print this string' ?>.
It's equivalent to <?php echo 'print this string' ?>.
<? echo 'this code is within short tags, but will only work '.
'if short_open_tag is enabled'; ?>
짧은 태그(위 예제의 세 번째 줄)는 기본적으로 사용할 수 있지만, short_open_tag php.ini 설정 지시어를 통해 끌 수 있어요. 또한 --disable-short-tags 설정으로 빌드한 PHP에서는 기본적으로 꺼져 있죠.
참고: 짧은 태그는 꺼질 수 있으므로 최대한 호환성을 확보하려면 일반 태그(
<?php ?>와<?= ?>)만 쓰는 걸 권장해요.
파일이 PHP 코드로 끝나는 경우에는 파일 끝의 PHP 닫는 태그를 생략하는 게 좋아요. 닫는 태그 뒤에 공백이나 새 줄이 붙으면 원치 않는 효과가 날 수 있거든요. 프로그래머가 그 시점에 출력할 의도가 없어도, PHP는 출력 버퍼링을 시작하니까요.
예제 #2 — PHP 코드만 있는 파일
<?php
echo "Hello world\n";
// ... more code
echo "Last statement\n";
// the script ends here with no PHP closing tag
HTML에서 빠져나오기 (Escaping from HTML)
여는 태그와 닫는 태그 쌍 밖에 있는 모든 내용은 PHP 파서가 무시해요. 덕분에 PHP 파일에 섞인 내용을 담을 수 있고, PHP를 HTML 문서에 끼워 넣어 템플릿 같은 걸 만들 수 있어요.
예제 #1 — HTML에 PHP 끼워 넣기
<p>This is going to be ignored by PHP and displayed by the browser.</p>
<?php echo 'While this is going to be parsed.'; ?>
<p>This will also be ignored by PHP and displayed by the browser.</p>
이게 예상대로 동작하는 이유가 있어요. PHP 인터프리터가 닫는 태그 ?>를 만나면, 바로 뒤따르는 개행 하나를 제외하고(자세한 건 명령 구분에서) 그다음 여는 태그를 만날 때까지 보이는 것을 그대로 출력하거든요. 다만 조건문 중간이라면, 조건의 결과를 먼저 판단해서 무엇을 건너뛸지 결정해요. 다음 예제를 볼게요.
조건을 쓰는 구조
예제 #2 — 조건을 이용한 고급 이스케이프
<?php if (true): ?>
This will show if the expression is true.
<?php else: ?>
Otherwise this will show.
<?php endif; ?>
여기서 PHP는 조건이 맞지 않는 블록을 건너뛰어요. 그 블록이 HTML로 보이는 PHP 여는/닫는 태그 밖에 있어도 마찬가지예요. PHP 인터프리터는 조건이 맞지 않는 블록을 통째로 점프하기 때문이죠.
큰 텍스트 블록을 출력할 때는 PHP 파싱 모드를 벗어나는 게, 모든 텍스트를 echo나 print로 보내는 것보다 일반적으로 더 효율적이에요.
참고: PHP를 XML이나 XHTML에 끼워 넣을 때는 표준을 지키려면 일반 PHP 태그
<?php ?>를 꼭 써야 해요.
명령 구분 (Instruction separation)
C나 Perl처럼 PHP도 각 문장 끝에 세미콜론으로 명령을 끝내야 해요. 다만 PHP 코드 블록의 닫는 태그는 자동으로 세미콜론을 의미해요. 그래서 PHP 블록의 마지막 줄에는 세미콜론을 붙이지 않아도 돼요. 블록의 닫는 태그는, 바로 뒤에 개행이 있다면 그 개행까지 포함해요.
예제 #1 — 닫는 태그가 바로 뒤의 개행을 포함하는 예
<?php echo "Some text"; ?>
No newline
<?= "But newline now" ?>
위 예제의 출력:
Some textNo newline
But newline now
예제 #2 — PHP 파서로 들어가고 나오는 예
<?php
echo "This is a test\n";
?>
<?php echo "This is a test\n" ?>
<?php echo "We omitted the last closing tag\n";
참고: 파일 끝에 있는 PHP 블록의 닫는 태그는 생략할 수 있어요. 어떤 경우엔 생략하는 게 도움이 되는데,
include나require를 쓸 때 파일 끝에 원치 않는 공백이 생기지 않으면서, 나중에 응답에 헤더를 추가할 수도 있거든요. 출력 버퍼링을 쓸 때도, 포함된 파일들이 만들어낸 부분의 끝에 원치 않는 공백이 붙는 걸 막으려면 편리해요.
주석 (Comments)
PHP는 'C', 'C++', 그리고 유닉스 셸 스타일(펄 스타일) 주석을 지원해요. 예를 들면:
예제 #1 — 주석
<?php
echo "This is a test\n"; // This is a one-line c++ style comment
/* This is a multi line comment
yet another line of comment */
echo "This is yet another test\n";
echo "One Final Test\n"; # This is a one-line shell-style comment
?>
"한 줄" 주석 스타일은 줄 끝이나 현재 PHP 코드 블록의 끝 중 먼저 오는 곳까지 주석으로 처리해요. 즉 // ... ?>나 # ... ?> 뒤에 있는 HTML 코드는 그대로 출력된다는 뜻이에요. ?>가 PHP 모드를 벗어나 HTML 모드로 돌아가고, //나 #은 그 동작을 막을 수 없거든요.
예제 #2 — 한 줄 주석
<h1>This is an <?php # echo 'simple';?> example</h1>
<p>The header above will say 'This is an example'.</p>
'C' 스타일 주석은 처음 만나는 */에서 끝나요. 이 주석을 중첩하지 않도록 주의하세요. 큰 코드 블록을 주석 처리하려다 이런 실수를 하기 쉬워요.
<?php
/*
echo 'This is a test'; /* This comment will cause a problem */
*/
?>