include()

include()문은 특정 파일을 인클루드 하고, 적용시킨다.

이하 내용은 require()에도 적용되는 사항이다. 두가지 구조는 수행실패를 제어하는 방법을 제외하고 모든면에서 동일하다. include()Warning을 발생시키는 반면에 require() Fatal Error을 발생시킨다. 즉, 파일이 존재하지 않을때 페이지 처리를 중단시키 고자 한다면 require()를 쓰는데 주저할 필요가 없다. include()는 이와같이 동작하지 않으므로 파일이 없더라도 스크립트는 계속 실행될것이다. 또한 적절한 include_path설정인지 확인해야 한다. require한 파일 안에서의 처리 오류는 수행을 멈추지 않는 점에 주의하십시오.

파일을 포함할 경우 가장 먼저 현재 작업 디렉토리에 상대 경로로 include_path를 찾고, 다음으로 현재 스크립트의 디렉토리에 상대 경로로 include_path를 찾습니다. 예를 들어, include_path가 .이고, 현재 작업 디렉토리 /www/에서 include/a.php를 포함하였고, 그 파일 안에 include "b.php"이 존재하면, b.php는 우선 /www/에서 찾고, 다음으로 /www/inclde/에서 찾습니다.

파일이 인클루드 되면, 그 코드를 포함하는 코드는 인클루드가 발생한 줄의 변수 유효 범위를 물려받는다. 호출하는 파일의 그 줄에서 사용되는 어떤 변수도 그 줄부터는 호출된 파일안에서 사용이 가능하다.

예 11-3. 기본적인 include() 사용예

vars.php
<?php

$color
= 'green';
$fruit = 'apple';

?>

test.php
<?php

echo "A $color $fruit"; // A

include 'vars.php';

echo
"A $color $fruit"; // A green apple

?>

인클루드가 호출하는 파일안의 함수내에서 발생한다면, 호출된 파일안의 모든 코드가 그 함수에서 정의된것처럼 동작한다. 그래서, 그 함수의 변수 유효범위를 따를것이다.

예 11-4. 함수 내에서 인클루드하기

<?php

function foo()
{
    global
$color;

    include
'vars.php';

    echo
"A $color $fruit";
}

/* vars.php is in the scope of foo() so     *
* $fruit is NOT available outside of this  *
* scope.  $color is because we declared it *
* as global.                               */

foo();                    // A green apple
echo "A $color $fruit";   // A green

?>

파일이 인클루드되면, 파싱은 PHP모드의 밖으로 나가서 목적 파일의 시작부분은 HTML모드로 들어가게 되고, 끝부분에서 원래대로 회복된다. 이때문에, 목적 파일에서 PHP코드로서 수행되어야 하는 코드는 유효한 PHP 시작과 마침 태그 로 막아줘야 한다.

PHP에서 "URL fopen wrappers"가 활성화되어 있으면 (디폴트 설정임), URL(HTTP나 다른 지원 래퍼(wrapper) - 프로토콜 목록은 부록 J을 참고)을 사용하여 파일을 인클루드 할수 있다. 목적 서버가 목적 파일을 PHP코드로 해석한다면, HTTP GET으로 사용된 URL 리퀘스트 문자열은 변수로서 넘겨지게 될것이다. 이와같은 일은 파일을 인크루드 하고 부모 파일의 변수 유효범위를 상속하는 것과 같은 경우가 되지는 않는다. 스크립트는 실질적으로 원격 서버에서 실행이 되고 나서 로컬 스크립트에 포함된다.

주의

PHP 4.3.0 이후의 Windows 버전 PHP에서는 이 함수를 이용하여 원격 파일에 접근할 수 없습니다. allow_url_fopen을 활성화하여도 마찬가지입니다.

예 11-5. HTTP로 include()하기

<?php

/* This example assumes that www.example.com is configured to parse .php
* files and not .txt files. Also, 'Works' here means that the variables
* $foo and $bar are available within the included file. */

// Won't work; file.txt wasn't handled by www.example.com as PHP
include 'http://www.example.com/file.txt?foo=1&bar=2';

// Won't work; looks for a file named 'file.php?foo=1&bar=2' on the
// local filesystem.
include 'file.php?foo=1&bar=2';

// Works.
include 'http://www.example.com/file.php?foo=1&bar=2';

$foo = 1;
$bar = 2;
include
'file.txt';  // Works.
include 'file.php';  // Works.

?>
관련정보는 Remote files, fopen(), file()함수를 참고하세요.

include()require()는 특별한 언어 구조이기 때문에, 조건절 블록안에 들어가게 된다면, 구문 블록안으로 그들을 완벽하게 막아줘야 한다.

예 11-6. include()와 조건절 블록

<?php

// This is WRONG and will not work as desired.
if ($condition)
    include
$file;
else
    include
$other;


// This is CORRECT.
if ($condition) {
    include
$file;
} else {
    include
$other;
}

?>

반환 다루기: include한 파일 안에서 그 파일의 수행을 종료하고, 호출한 스크립트로 돌아가기 위해서 return()문을 실행할 수 있습니다. 또한, 값을 반환하는 일도 가능합니다. include 호출을 일반 함수를 사용한 것처럼 값을 받을 수 있습니다. 그러나, 원격 파일을 포함하였을 때, 그 파일의 출력이 (다른 로컬 파일처럼) 유효한 PHP 시작과 끝 태그를 가지지 않는다면 이 값을 받을 수 없습니다. 이 태그들 안에 필요한 값을 정의하면, include한 파일의 어떤 위치에서라도 사용할 수 있습니다.

참고: PHP 3에서 그 블록이 함수가 아니면 블록 안에 return이 보이지 않을것이다. 그런 경우에는 전체 파일이 아니고 그 함수로만 return()이 적용된다.

예 11-7. include()return()

return.php
<?php

$var
= 'PHP';

return
$var;

?>

noreturn.php
<?php

$var
= 'PHP';

?>

testreturns.php
<?php

$foo
= include 'return.php';

echo
$foo; // prints 'PHP'

$bar = include 'noreturn.php';

echo
$bar; // prints 1

?>

인클루드가 성공하면 $bar1의 값을 갖는다. 위 두 예제의 차이점에 주의해야 한다. 첫번째 경우는 인클루드된 파일에서 return()을 사용하지만 다른 예는 그렇지 않다. 변수로 파일을 "인클루드"하는 다른 방법은 fopen(), file() 을 사용하거나, Output Control Functions와 함께 include()를 쓰는것이다.

참고: 이것은 함수가 아닌 언어 구조이기 때문에, 변수 함수 방식으로 호출할 수 없습니다.

require(), require_once(), include_once(), readfile(), virtual(), 그리고 include_path도 참고하세요.