PHP · 심층 가이드
PHP Hello World 완전 정리
PHP 파일 한 개를 CLI와 웹 서버 양쪽에서 돌려 보며 echo와 print의 차이, Heredoc, JSON 응답, 내장 서버 라우터까지 첫 출력이 지나가는 경로를 전부 확인합니다.
PHP는 처음부터 HTML 문서 안에 끼워 넣는 템플릿 도구로 출발했습니다. 그래서 main() 같은 진입 함수가 없고, 파일은 기본적으로 출력 모드로 시작해 <?php 를 만나는 순간부터만 코드로 해석됩니다. 다른 언어를 먼저 배운 사람이 가장 먼저 어색해하는 지점이 여기입니다. 태그 바깥의 공백 한 칸도 그대로 응답 본문이 되고, 같은 파일이 CLI에서는 표준 출력으로, php-fpm 뒤에서는 HTTP 본문으로 흘러갑니다.
순서는 출력 자체에서 시작해 실행 환경으로 넓혀 가면 편합니다. Hello World 출력과 print 와 echo 비교로 표현식과 구문의 차이를 잡은 뒤, HTML 안에 PHP 끼워 넣기에서 태그 경계를 몸으로 익히고, 여러 줄 출력이 지저분해지는 시점에 Heredoc 문자열과 Nowdoc 문자열로 넘어가면 변수 보간을 켜고 끄는 감각이 생깁니다. 뒤쪽의 CLI 인자 읽기와 내장 서버 라우터 스크립트는 같은 코드가 SAPI에 따라 어떻게 달리 동작하는지 보여 주는 짝입니다.
가장 흔하게 발목을 잡는 것은 닫는 태그입니다. 파일 끝의 ?> 뒤에 개행이나 공백이 남아 있으면 그 바이트가 먼저 전송되고, 이후 header()나 세션 시작은 headers already sent 오류로 실패합니다. 편집기가 붙인 UTF-8 BOM도 같은 결과를 냅니다. 그래서 PHP 코드만 들어 있는 파일은 닫는 태그를 아예 쓰지 않는 것이 표준 관행입니다. JSON 응답 보내기를 실습할 때 이 규칙을 어기면 응답 앞에 빈 줄이 붙어 파서가 깨지므로 바로 체감할 수 있습니다.
01Hello World 출력
가장 기본적인 PHP 출력 예제입니다. 웹과 CLI 환경 모두에서 같은 문법으로 시작할 수 있습니다.
PHP code
<?php
echo "Hello, World!
";같은 코드를 CLI와 브라우저에서 각각 실행해 보면 PHP의 실행 맥락을 더 빨리 익힐 수 있습니다.
echo 뒤 세미콜론을 빼먹으면 곧바로 parse error가 납니다.
02print 와 echo 비교
echo, print, printf를 나란히 비교하며 PHP의 대표적인 출력 방식을 익히는 예제입니다.
PHP code
<?php
echo "echo
";
print "print
";
printf("php %s
", PHP_VERSION);같은 코드를 CLI와 브라우저에서 각각 실행해 보면 PHP의 실행 맥락을 더 빨리 익힐 수 있습니다.
PHP 열기 태그나 세미콜론을 빼먹으면 가장 먼저 parse error가 발생합니다.
03CLI 인자 읽기
CLI에서 넘어온 인자를 받아 간단한 스크립트를 만드는 예제입니다.
PHP code
<?php
$name = $argv[1] ?? 'PHP';
echo "Hello, {$name}
";같은 코드를 CLI와 브라우저에서 각각 실행해 보면 PHP의 실행 맥락을 더 빨리 익힐 수 있습니다.
$argv는 CLI 실행 환경에서만 채워지므로 웹 요청에서는 같은 방식으로 동작하지 않습니다.
04HTML 안에 PHP 끼워 넣기
템플릿 안에서 짧은 출력 태그를 사용해 HTML에 값을 렌더링하는 예제입니다.
PHP code
<?php
$title = 'PHP Starter';
?>
<h1><?= htmlspecialchars($title, ENT_QUOTES, 'UTF-8') ?></h1>같은 코드를 CLI와 브라우저에서 각각 실행해 보면 PHP의 실행 맥락을 더 빨리 익힐 수 있습니다.
출력 전에 escape 하지 않으면 XSS 취약점이 생길 수 있습니다.
05Heredoc 문자열
여러 줄 문자열을 깔끔하게 선언하는 heredoc 예제입니다.
PHP code
<?php
$message = <<<TEXT
PHP can render
multiple lines easily.
TEXT;
echo $message;같은 코드를 CLI와 브라우저에서 각각 실행해 보면 PHP의 실행 맥락을 더 빨리 익힐 수 있습니다.
PHP 열기 태그나 세미콜론을 빼먹으면 가장 먼저 parse error가 발생합니다.
06Nowdoc 문자열
변수 치환 없이 여러 줄 텍스트를 그대로 보관하는 nowdoc 예제입니다.
PHP code
<?php
$query = <<<'SQL'
SELECT *
FROM users
WHERE active = 1
SQL;
echo $query;같은 코드를 CLI와 브라우저에서 각각 실행해 보면 PHP의 실행 맥락을 더 빨리 익힐 수 있습니다.
PHP 열기 태그나 세미콜론을 빼먹으면 가장 먼저 parse error가 발생합니다.
07환경 변수 읽기
운영 환경에 따라 설정을 분기할 때 자주 쓰는 환경 변수 읽기 예제입니다.
PHP code
<?php
$appEnv = getenv('APP_ENV') ?: 'local';
echo "env: {$appEnv}
";같은 코드를 CLI와 브라우저에서 각각 실행해 보면 PHP의 실행 맥락을 더 빨리 익힐 수 있습니다.
PHP 열기 태그나 세미콜론을 빼먹으면 가장 먼저 parse error가 발생합니다.
08JSON 응답 보내기
간단한 API 응답을 JSON으로 반환하는 PHP 기본 예제입니다.
PHP code
<?php
header('Content-Type: application/json; charset=utf-8');
echo json_encode([
'language' => 'php',
'version' => PHP_VERSION,
], JSON_UNESCAPED_UNICODE);같은 코드를 CLI와 브라우저에서 각각 실행해 보면 PHP의 실행 맥락을 더 빨리 익힐 수 있습니다.
header 호출 전에 출력이 이미 발생하면 헤더를 보낼 수 없습니다.
09Composer 자동 로딩 시작점
Composer 기반 프로젝트에서 대부분의 스크립트가 시작하는 진입점 형태입니다.
PHP code
<?php
require __DIR__ . '/vendor/autoload.php';
echo "autoload ready
";같은 코드를 CLI와 브라우저에서 각각 실행해 보면 PHP의 실행 맥락을 더 빨리 익힐 수 있습니다.
vendor/autoload.php 경로를 잘못 잡으면 첫 줄에서 바로 fatal error가 발생합니다.
10내장 서버 라우터 스크립트
PHP 내장 웹 서버와 함께 가장 작은 라우터를 만드는 예제입니다.
PHP code
<?php
if ($_SERVER['REQUEST_URI'] === '/health') {
echo 'ok';
return;
}
echo 'home';같은 코드를 CLI와 브라우저에서 각각 실행해 보면 PHP의 실행 맥락을 더 빨리 익힐 수 있습니다.
PHP 열기 태그나 세미콜론을 빼먹으면 가장 먼저 parse error가 발생합니다.
정리하며
- 코드만 있는 파일은 닫는
?>를 생략해 의도치 않은 출력과 헤더 오류를 막습니다. - echo는 여러 인자를 받는 구문, print는 항상 1을 돌려주는 표현식입니다.
- 변수 보간이 필요하면 Heredoc, 원문 그대로 두려면 Nowdoc을 씁니다.
- 같은 스크립트라도 CLI는 $argv, 웹은 슈퍼글로벌로 입력을 받으니 진입점을 나눠 둡니다.
더 깊이 들어가고 싶다면 PHP 학습 라이브러리에서 다른 주제 가이드를 이어서 보거나, 언어 비교에서 같은 개념이 다른 언어에서 어떻게 표현되는지 확인해 보세요.