include와 require 모두 다른 PHP 파일의 내용을 현재 파일로 가져와(그리고 실행)합니다. 유일한 차이는 실패를 처리하는 방식입니다. require는 파일이 없으면 치명적 오류(fatal error)를 발생시키는 반면, include는 경고만 발생시키고 계속 진행합니다.
<?php
include "config.php"; // 없으면 → 경고, 스크립트 계속 진행
require "database.php"; // 없으면 → 치명적 오류, 스크립트 중단
include → 파일 없음 → 경고 발생, 실행 계속 (해당 파일의 코드는 건너뜀)
require → 파일 없음 → 치명적 오류 발생, 실행 중단
애플리케이션이 없이는 실행될 수 없는 파일(핵심 클래스, 중요한 설정, 데이터베이스 설정)에는 **require**를 사용하세요 — 없으면 단단히 중단되기를 원하기 때문입니다. 누락되어도 페이지가 죽으면 안 되는 선택적 파일(예: 사이드바 템플릿)에는 **include**를 사용하세요.
require_once "functions.php"; // 아직 포함되지 않았을 때만 파일 포함
include_once "helper.php";
require_once/include_once는 아직 포함되지 않은 경우에만 파일을 가져옵니다 — 파일이 여러 번 포함될 수 있을 때(예: 여러 파일이 끌어오는 클래스 정의) "함수/클래스를 재선언할 수 없음" 오류를 피하는 데 필수적입니다.
// 포함된 파일은 같은 스코프를 공유하며 함수, 클래스, 변수를 정의할 수 있음
// config.php:
$dbHost = "localhost";
// main.php:
require "config.php";
echo $dbHost; // "localhost" — 변수가 사용 가능
// ❌ 구식 — 모든 클래스 파일을 수동으로 require
require_once "User.php";
require_once "Order.php";
// ✅ 현대 — Composer 오토로딩이 클래스를 필요할 때 자동으로 로드
require "vendor/autoload.php"; // 한 줄; 클래스는 사용 시 로드됨 (PSR-4)
$user = new User(); // User.php가 자동으로 로드됨
현대 PHP에서는 클래스에 수동 require를 거의 사용하지 않습니다 — Composer의 오토로더가 필요할 때 로드합니다. 여전히 이를 부트스트랩하기 위해 require "vendor/autoload.php"를 한 번 사용합니다.
include와 require를 이해하는 것은 기본적이지만 중요한 PHP 지식입니다 — PHP 파일이 코드를 공유하는 방식이며, 그 구분은 정확성에 중요합니다.
핵심은 실패 동작입니다. 필수 파일에는 require(중요한 파일이 없으면 앱이 빠르고 명확하게 실패하도록), 선택적 파일에는 include(누락된 비핵심 파일이 페이지를 죽이지 않도록)를 사용합니다.
_once 변형을 아는 것은 클래스나 함수 정의를 실수로 두 번 포함하여 발생하는 흔한 "재선언할 수 없음" 오류를 막는 데 실질적으로 필수적입니다.
마찬가지로 중요한 것은 현대적 맥락을 이해하는 것입니다. 이 구문들은 기초적이지만, 현대 PHP는 각 파일을 수동으로 require하는 대신 Composer 오토로딩(필요할 때 클래스 로드)에 의존하므로, 현재 코드에서는 대부분 require "vendor/autoload.php"를 한 번만 하고 나머지는 오토로딩에 맡깁니다.
include/require 메커니즘(그리고 각 실패 모드가 언제 적절한지)과 현대 오토로딩이 수동 include를 어떻게 대체하는지를 모두 아는 것은 신구 PHP 코드베이스를 다루는 일상 지식입니다.