require_once 문이란?
PHP의 require_once 문은 require 문과 거의 동일한 방식으로 작동하지만, 한 가지 중요한 차이점이 있습니다. 바로 이미 한 번 포함된 파일은 다시 포함되지 않는다는 점입니다.
즉, 동일한 파일이 여러 번 호출되더라도 실제로는 처음 한 번만 포함되어 실행됩니다. 참고로 include나 require 문으로 이미 포함된 파일 역시 이후에 require_once를 사용하더라도 다시 포함되지 않습니다.
그 외의 동작 방식은 require 문과 완전히 동일하며, 지정한 파일을 찾지 못할 경우 치명적 오류(fatal error)를 발생시키고 스크립트 실행을 즉시 중단합니다.
require_once 기본 예제
아래 예제에서 메인 PHP 스크립트는 test.php 파일을 두 번 포함하려고 시도합니다.
예제 코드
<?php
echo "inside main script\n";
echo "now including with require_once test.php script\n";
require_once "test.php";
echo "try to include it again";
require_once "test.php";
?>
//test.php
<?php
echo "File included\n";
?>
실행 결과
메인 스크립트를 명령줄에서 실행하면 다음과 같은 결과가 출력됩니다.
inside main script
now including with require_once test.php script
File included
try to include it again
"File included" 메시지가 한 번만 출력된 것을 확인할 수 있습니다. 두 번째 require_once 호출 시에는 test.php가 이미 포함되었기 때문에 자동으로 무시됩니다. 이것이 require_once의 핵심 동작 원리입니다.
파일을 찾지 못할 때의 오류
require_once 문 역시 존재하지 않는 파일을 포함하려고 하면 치명적 오류(fatal error)를 발생시킵니다.
예제 코드
<?php
echo "inside main script\n";
echo "now including with require_once notest.php script\n";
require_once "notest.php";
?>
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다. 오류가 발생하는 순간 프로그램이 즉시 종료된다는 점에 유의하세요.
inside main script
now including with require_once notest.php script
PHP Fatal error: require_once(): Failed opening required 'notest.php' (include_path='C:\xampp\php\PEAR') in line 4
Fatal error: require_once(): Failed opening required 'notest.php' (include_path='C:\xampp\php\PEAR') in line 4
정리 및 활용 팁
- require vs require_once: 함수 라이브러리나 클래스 정의 파일처럼 중복 포함 시 재선언 오류(redeclare error)가 발생할 수 있는 파일에는 require_once를 사용하는 것이 안전합니다.
- include_once와의 차이: include_once는 파일을 찾지 못해도 경고(warning)만 발생하고 실행이 계속되지만, require_once는 치명적 오류로 실행이 중단됩니다.
- 성능 고려사항: require_once는 호출 시마다 포함 여부를 확인해야 하므로, 대규모 프로젝트에서는 spl_autoload_register() 같은 오토로딩 방식을 사용하는 것이 더 효율적일 수 있습니다.