前言
目前,php 有 4 个加载文件的语句:
- require
- include
- include_once
- require_once
基本用法
先来说一下基本语法及介绍,后面介绍四者区别。
一、require()
require()
一般放在 php 脚本的最前面,php 执行前就会先读入 require 指定引入的文件,包含并尝试执行引入的脚本文件。
require 工作方式是提高 php 的执行效率,当它在同一个网页中解释过一次后,第二次便不会解释。但同样的,正因为它不会重复解释引入文件,所以当 php 中使用循环或条件语句来引入文件时,它不再可用(需要用到 include)。
二、include()
include()
可以放在 php 脚本的任意位置,一般放在流程控制的处理部分中。当 php 脚本执行到 include 指定引入的文件时,才将它包含并尝试执行。
这种方式可以把程序执行时的流程进行简单化,当第二次遇到相同文件时,php 还是会重新解释一次,include 相对于 require 的执行效率下降很多,同时在引入文件中包含用户自定义函数时,php 在解释过程中会发生函数重复定义问题。
三、require_once() / include_once()
分别与 require / include
作用相同,不同的是他们在执行到时会先检查目标内容是不是在之前已经导入过,如果导入过了,那么便不会再次重复引入其同样的内容。
include / require 二者区别
include 有返回值,而 require 没有返回值。
include 在加载文件失败时,会生成一个警告(E_WARNING),在错误发生后脚本仍继续执行,所以include 用在希望继续执行并向用户输出结果时。
<?php
# 引入一个不存在的脚本(xxx.php)
include('./xxx.php');
# 上面发生警告后下面的代码仍然继续执行
echo 'hello!';
?>
如下图所示,引入一个不存在的脚本文件,php 抛出警告后,后面的代码仍然执行:
再来看 require,当加载失败时会生成一个致命错误(E_COMPILE_ERROR),在错误发生后脚本停止执行,一般用在后续代码依赖于载入的文件的时候。
<?php
# 引入一个不存在的脚本(xxx.php)
require('./xxx.php');
# 上面发生致命错误后下面的代码不会执行
echo 'hello!';//得不到执行
?>
如下图所示,引入一个不存在的脚本文件,php 抛出致命错误后,下面的代码不会执行:
include / include_once 二者区别
include 载入的文件不会判断是否重复,也就是说 只要有 include 语句,就会再次重复载入一次,即使很有可能出现重复载入的情况。
而 include_once 载入文件时会有内部判断机制判断前面代码是否已经载入过,需要注意的是include_once 是 根据前面有无引入相同路径的文件为判断 的,而不是根据文件中的内容(即两个待引入的文件内容相同,使用 include_once 还是会引入两个)。
同理,require / require_once 也是这个区别,很好理解不做演示了。
载入时执行过程
- 从 include(require)语句退出 php 脚本模式(进入 html 代码模式)
- 载入 include 语句所设定的文件中的代码,并尝试执行
- 退出 html 模式,重新进入 php 脚本模式,继续后面脚本程序的执行
例如,我有一个主文件 test1.php
,然后引入 test2.php
:
### test1.php ###
<html>
<body>
主文件开始位置:
<?php
echo "<br> 主文件中位置 A";
include "./test2.php"; //要载入的文件
echo "<br> 主文件中位置 B";
?>
<br> 主文件结束位置
</body>
</html>
### test2.php ###
<br> 被载入文件位置 1
<?php
echo "<br> 被载入文件位置 2";
?>
<br> 被载入文件位置 3
执行结果为:
返回值的比较
上面说到,include 有返回值,而 require 无返回值。
对于 include,如果载入成功,有返回值,返回值为 1;如果载入失败,则返回 false。
<?php
# 如果载入正确(文件存在)
$a = include('./api.php');
echo '————载入正确返回值' . var_dump($a);
# 如果载入错误(文件不存在)
$b = include('./api.js');
echo '————载入错误返回值' . var_dump($b)
?>
结果如下图所示:
对于 require,如果载入成功,有返回值,返回值为 1;如果载入失败,无返回值。
<?php
# 如果载入正确(文件存在)
$a = require('./api.php');
echo '————载入正确返回值' . var_dump($a);
# 如果载入错误(文件不存在)
$b = require('./api.js');
echo '————载入错误返回值' . var_dump($b)
?>
当引入的文件中存在 return
当被载入文件中有 return 语句时,会有另外的机制。
此时 return 语句的作用是终止载入过程,即被载入文件中 return 语句的后续代码不再载入。
当然,return 语句也可以用于被载入文件载入时返回一个数据。
不做演示了,跟函数中的 return 一样,只不过换个说法,终止载入 = 跳出函数。