首页 > PHP 阅读:19

PHP include和require:文件包含语句

包含语句用于在 PHP 文件中引入另一个文件,这样有利于代码重用。PHP 中共有 4 个包含外部文件的方法,分别是 include、include_once、require、require_once。

include 语句

include 语句包含并运行指定文件。被包含文件先按参数给出的路径寻找,如果没有给出目录(只有文件名),就按照 include_path(在配置文件中可查看 include_path)指定的目录寻找。如果在 include_path 下没找到该文件,那么 include 最后会在调用脚本文件所在的目录和当前工作目录下寻找。如果最后仍未找到文件,include 结构就会发出一条警告,例如:
<?php
include 'a.php';
echo "111";
?>
上述示例中,若 PHP 找不到 a.php 文件,则会发出一条警告,但后面的语句还会继续执行。以上代码的执行结果在浏览器中的输出如下:

Warning: include(a.php): failed to open stream: No such file or directory in /Library/WebServer/Documents/book/str.php on line 280
Warning: include(): Failed opening 'a.php' for inclusion (include_path='.:') in /Library/WebServer/Documents/book/str.php on line 280
111


我们在 a.php 里编写代码:
<?php
$color = 'green';
?>
在 test.php 中编写代码:
<?php
include 'a.php';
echo $color;
?>
a.php 和 test.php 在同一个文件夹里。运行 test.php,打印结果为:

green


当一个文件被包含时,其中所包含的代码继承了 include 所在行的变量范围。从该处开始,调用文件在该行处可用的任何变量在被调用的文件中也都可用。不过所有在包含文件中定义的函数和类都具有全局作用域。

如果 include 出现于调用文件中的一个函数里,那么被调用的文件中所包含的所有代码将表现得如同它们是在该函数内部定义的一样。所以它将遵循该函数的变量范围。此规则的一个例外是魔术常量,它们是在发生包含之前就已被解析器处理的。

a.php 中的代码:
<?php
$color = 'green';
echo __LINE__ . "<br/>";
?>
test.php 中的代码:
<?php
include 'a.php';
echo $color . "<br/>";
aa();
function aa(){
    global $color;
    echo $color;
}
?>
运行 test.php 文件,结果如下:

3
green
green

include_once 语句

include_once 语句和 include 语句类似,唯一的区别就是该文件如果已经被包含,就不会再次包含。

include_once 可以用于在脚本执行期间同一个文件有可能被包含超过一次的情况下确保它只被包含一次,以避免函数重定义、变量重新赋值等问题。

例如,a.php 中的代码:
<?php
echo 1;
echo 2;
?>
test.php 中的代码:
<?php
include 'a.php';
include 'a.php';
?>
运行 test.php,打印结果为:

1212

如果 test.php 中的代码为:
<?php
include_once 'a.php';
include_once 'a.php';
?>
那么运行 test.php 的结果为:

12

require 语句

require 语句和 include 语句几乎完全一样,不同的是当被包含文件不存在时,require 语句会发出一个 Fatal error 错误且程序终止执行,include 则会发出一个 Warining 警告但会接着向下执行。

例如,有如下 test.php 代码:
<?php
require 'b.php';
echo 1;
?>
如果 PHP 没有找到 b.php 文件,就会发出一个错误。代码执行结果如下:

Warning: require(b.php): failed to open stream: No such file or directory in /Library/WebServer/Documents/book/str.php on line 280
Fatal error: require(): Failed opening required 'b.php' (include_path='.:') in /Library/WebServer/Documents/book/str.php on line 280

如果 test.php 中将 require 换成 include 包含 b.php,执行结果则会是:

Warning: include(b.php): failed to open stream: No such file or directory in /Library/WebServer/Documents/book/str.php on line 280
Warning: include(): Failed opening 'b.php' for inclusion (include_path='.:') in /Library/WebServer/Documents/book/str.php on line 280
1

使用 include 包含的文件不存在,发出一个警告,但程序会继续执行,所以显示出了 1。

require_once 语句

require_once 语句和 require 语句完全相同,唯一的区别是 PHP 会检查该文件是否已经被包含过,如果是就不会再次包含。