차림

2007년 2월 4일

PHP include와 require의 차이점

다른 파일을 불러들인다는 점에서 includerequire는 같다. 하지만 오류가 있을 경우 그걸 처리하는 방식이 다르다.

include는 오류가 있으면 오류 내용을 경고로 알린 뒤, 그 나머지 부분을 제대로 실행한다. 반면 require는 오류가 있으면 오류 내용을 알린 뒤 그걸로 끝이다. 일단 오류가 일어나면 더 이상 프로그램을 실행하지 않는다.

include의 오류 예

예를 들어, 아래와 같은 코드를 생각해 보자.


sample.php

<html>
<body>

<?php
  echo "<p>안녕하신감</p>";
  include "../footer.php";
  echo "<p>안녕 못하당</p>";
?>

<p>안 됐당</p>

</body>
</html>

해당 경로에 footer.php 파일이 없을 경우 sample.php 파일은 브라우저에 다음과 같은 결과를 보여준다.

안녕하신감

Warning: main(../footer.php): failed to open stream: No such file or directory in /example/sample.php on line 6

Warning: main(../footer.php): failed to open stream: No such file or directory in /example/sample.php on line 6

Warning: main(): Failed opening '../footer.php' for inclusion (include_path='.:/example') in /example/sample.php on line 6

안녕 못하당

안 됐당

오류 내용에서 경로명은 임의로 바꾼 것이고, 하여튼 중요한 건 오류가 있는 부분은 실행되지 않지만 앞뒤로 그 나머지는 모두 실행된다는 점이다.

require의 오류 예

하지만 require의 경우엔 다르다. 예를 들어, 아래와 같은 코드를 짰다고 하자.


sample.php

<html>
<body>

<?php
  echo "<p>안녕하신감</p>";
  require "../footer.php";
  echo "<p>안녕 못하당</p>";
?>

<p>안 됐당</p>

</body>
</html>

그런데 해당 경로에 footer.php 파일이 없다면 sample.php 파일은 브라우저에 다음과 같은 결과를 보여준다.

안녕하신감

Warning: main(../footer.php): failed to open stream: No such file or directory in /example/sample.php on line 6

Warning: main(../footer.php): failed to open stream: No such file or directory in example/sample.php on line 6

Fatal error: main(): Failed opening required '../footer.php' (include_path='.:/example') in /example/sample.php on line 6

include 때와는 달리 '안녕 못하당'과 '안 됐당'이 출력되지 않았다. 그러니까 require는 오류가 있으면 거기부터 그 나머지는 실행하지 않는다는 것을 알 수 있다. 게다가 오류도 include에서는 그냥 경고 (Warning)라고만 하는데, require에서는 치명적인 오류 (Fatal error)라고 한다.

목록