require
require와 include는 실패 처리 방식을 제외하면 거의 동일합니다. require는 오류 발생 시 E_COMPILE_ERROR 수준 오류를 생성합니다. 즉, 스크립트가 종료되는 반면, include는 경고(E_WARNING)만 생성하고 스크립트는 계속 실행됩니다.
include
include 문은 지정된 파일을 포함하고 실행합니다.
require에는 다음 문서도 적용됩니다.
포함된 파일은 매개변수에 지정된 경로에 따라 먼저 검색됩니다. 디렉터리가 지정되지 않으면(파일 이름만) 검색됩니다. include_path에 지정된 디렉터리에 따라. include_path 아래에 파일이 없으면 include는 호출 스크립트 파일이 있는 디렉터리와 현재 작업 디렉터리에서 최종적으로 검색합니다. include 구조는 파일이 마지막에 발견되지 않으면 경고를 발행합니다. 이는 치명적인 오류를 발행하는 require와 다릅니다. (include_path에 대해서는 PHP 확장 옵션 및 구성 정보 문서를 참조하세요.)
경로가 정의된 경우 - 절대 경로인지 여부(드라이브 문자로 시작하거나 Windows 및 / Unix/에서 시작) Linux) ) 또는 현재 디렉터리에 대한 상대 경로( . 또는 .. 로 시작) - include_path는 완전히 무시됩니다. 예를 들어 파일이 ../로 시작하면 파서는 현재 디렉터리의 상위 디렉터리에서 파일을 찾습니다.
파일이 포함되면 파일에 포함된 코드는 포함 줄의 변수 범위를 상속합니다. 그 시점부터 해당 줄의 호출 파일에서 사용할 수 있는 모든 변수는 호출된 파일에서도 사용할 수 있습니다. 그러나 포함 파일에 정의된 모든 함수와 클래스에는 전역 범위가 있습니다.
예제#1 기본 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 ?>
호출 파일의 함수에 include가 나타나면 호출된 파일에 포함된 모든 코드는 마치 정의된 것과 동일합니다. 함수 내부. 따라서 해당 함수의 가변 범위를 따릅니다. 이 규칙의 한 가지 예외는 포함이 발생하기 전에 파서에서 처리되는 매직 상수입니다.
예제 #2 함수에 포함
<?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 래퍼"가 활성화된 경우(기본 구성) 로컬 파일 대신 URL(HTTP 또는 기타 지원되는 래핑 프로토콜을 통해 - 지원되는 프로토콜 및 래핑 프로토콜 참조)을 사용하여 지정할 수 있습니다. 포함할 파일입니다. 대상 서버가 대상 파일을 PHP 코드로 해석하는 경우 HTTP GET에 대한 URL 요청 문자열을 사용하여 포함된 파일에 변수를 전달할 수 있습니다. 이는 파일을 포함하고 상위 파일의 가변 공간을 상속하는 것과 엄격하게 동일하지 않습니다. 스크립트 파일은 실제로 원격 서버에서 실행되었으며 로컬 스크립트에는 해당 결과가 포함됩니다.
경고 버전 4.3.0 이전의 PHP Windows 버전은 허용_url_fopen이 활성화된 경우에도 이 기능을 통한 원격 파일 액세스를 지원하지 않습니다.
예제 #3 HTTP를 통한 포함
<?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. ?>
보안 경고
원격 파일은 원격 서버에서 처리될 수 있지만(파일 접미사 및 원격 서버에서 PHP를 실행하는지 여부에 따라), 합법적인 PHP 스크립트는 원격 서버에서 처리되므로 생성되어야 합니다. 로컬 서버가 처리합니다. 원격 서버의 파일을 원격으로 실행하고 결과만 출력해야 한다면 readfile() 함수를 사용하는 것이 좋습니다. 또한 원격 스크립트가 합법적이고 필요한 코드를 생성하도록 특별히 주의하십시오.
반환 값 처리: include는 FALSE를 반환하고 실패 시 경고를 표시합니다. 포함 파일에 별도로 지정하지 않는 한 성공적인 포함은 1을 반환합니다. 포함된 파일의 return 문을 사용하여 파일의 프로그램 실행을 종료하고 이를 호출한 스크립트로 돌아갈 수 있습니다. 포함된 파일에서 값을 반환하는 것도 가능합니다. include 호출의 반환 값은 일반 함수처럼 얻을 수 있습니다. 그러나 원격 파일의 출력에 합법적인 PHP 시작 및 종료 태그(로컬 파일과 마찬가지로)가 없으면 원격 파일을 포함할 때 작동하지 않습니다. 파일이 포함된 위치 다음에 사용 가능한 태그 내에서 필수 변수를 정의할 수 있습니다.
include는 특수한 언어 구조이므로 해당 매개변수에는 괄호가 필요하지 않습니다. 반환 값을 비교할 때는 주의하세요.
Example #4 比较 include 的返回值
<?php // won't work, evaluated as include(('vars.php') == 'OK'), i.e. include('') if (include('vars.php') == 'OK') { echo 'OK'; } // works if ((include 'vars.php') == 'OK') { echo 'OK'; } ?>
Example #5 include 和 return 语句
return.php
$var = 'PHP';
return $var;
?>
noreturn.php
$var = 'PHP';
?>
testreturns.php
$foo = include 'return.php';
echo $foo; // prints 'PHP'
$bar = include 'noreturn.php';
echo $bar; // prints 1
?>
$bar 的值为 1 是因为 include 成功运行了。注意以上例子中的区别。第一个在被包含的文件中用了 return 而另一个没有。如果文件不能被包含,则返回 FALSE 并发出一个E_WARNING 警告。
如果在包含文件中定义有函数,这些函数不管是在 return 之前还是之后定义的,都可以独立在主文件中使用。如果文件被包含两次,PHP 5 发出致命错误因为函数已经被定义,但是 PHP 4 不会对在 return 之后定义的函数报错。推荐使用 include_once 而不是检查文件是否已包含并在包含文件中有条件返回。
另一个将 PHP 文件“包含”到一个变量中的方法是用输出控制函数结合 include 来捕获其输出,例如:
Example #6 使用输出缓冲来将 PHP 文件包含入一个字符串
<?php $string = get_include_contents('somefile.php'); function get_include_contents($filename) { if (is_file($filename)) { ob_start(); include $filename; $contents = ob_get_contents(); ob_end_clean(); return $contents; } return false; } ?>
要在脚本中自动包含文件,参见 php.ini 中的 auto_prepend_file 和 auto_append_file 配置选项。
Note: 因为是一个语言构造器而不是一个函数,不能被 可变函数 调用。
require_once
(PHP 4, PHP 5)
require_once 语句和 require 语句完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含
include_once
(PHP 4, PHP 5)
include_once 语句在脚本执行期间包含并运行指定文件。此行为和 include 语句类似,唯一区别是如果该文件中已经被包含过,则不会再次包含。如同此语句名字暗示的那样,只会包含一次。
include_once 可以用于在脚本执行期间同一个文件有可能被包含超过一次的情况下,想确保它只被包含一次以避免函数重定义,变量重新赋值等问题。
Note:
在 PHP 4中,_once 的行为在不区分大小写字母的操作系统(例如 Windows)中有所不同,例如:
Example #1 include_once 在 PHP 4 运行于不区分大小写的操作系统中
<?php include_once "a.php"; // 这将包含 a.php include_once "A.php"; // 这将再次包含 a.php!(仅 PHP 4) ?>
此行为在 PHP 5 中改了,例如在 Windows 中路径先被规格化,因此 C:\PROGRA~1\A.php 和 C:\Program Files\a.php 的实现一样,文件只会被包含一次。