include 与 require 关键字
作用:
- 它们都是用来包含并且运行指定文件的。
- 如果被包含的文件包含关键字
return
,那么return
后面的代码将不会执行。并且可以使用变量来接收return
的返回值。被包含文件没有return
时,也会有结果,那些结果可以用来判断是否导入成功
区别:
它们包含的文件不存在时所产生的错误级别不同。其中:
include
产生 E_WARNING 级别错误,脚本继续运行require
产生 E_COMPILE_ERROR 级别错误,脚本终止运行
用法:(关键字的用法一致)
<?php
include 'aa.php'; //只包含文件名的文件
include('./bb.php'); //相对路径的文件
require '/aa.php'; //绝对路径的文件
//如果 cc.php 文件使用 return 返回 ‘我是 cc 的返回值’
$c = require('cc.php'); // $c 的结果为 ‘我是 cc 的返回值’
扩展:
- include_once 与 require _once 的用法一致,但是这两个在导入前,会检查是否导入过,如果有就跳过
include_path
配置的值,会影响包含只有文件名的文件的路径。
解释:
只有文件名的路径:aa.php
、bb.php
相对路径的路径:./aa.php
、xxx/bb.php
绝对路径:/aa.php
、C:\aa\index.php
实验:
目的:通过实验搞清楚包含只有文件名的文件时,程序是如何寻找文件的
实验流程:
- 已知php.ini 中配置:
include_path='.;C:\php\pear'
步骤一:(创建实验文件)
D:\a.php 文件
<?php
echo PHP_EOL . '我在 ' . __FILE__ . PHP_EOL;
require 'test/b.php';
D:\test\b.php 文件
<?php
echo PHP_EOL . '我在 ' . __FILE__ . PHP_EOL;
require 'c.php';
c.php 文件 (拷贝3份,分别复制到如下路径D:\c.php
C:\php\pear\c.php
D:\test\c.php
)
<?php
echo PHP_EOL . '我在 ' . __FILE__ . PHP_EOL;
步骤二:(运行程序,查看系统获取文件的顺序)
去到 D:\
目录,打开CMD,执行如下命令 php a.php
,输出:
我在 D:\a.php
我在 D:\test\b.php
我在 D:\c.php
程序读取的是D:\c.php
文件。这是配置文件第一个分号;
前的点.
决定的,表示‘当前目录’,即去当前目录寻找,执行文件的路径为D:\a.php
,所以去D:\
下面找a.php
文件
步骤三:
删除D:\c.php
,继续运行 php a.php
,输入如下:
我在 D:\a.php
我在 D:\test\b.php
我在 C:\php\pear\c.php
这次程序读取的是D:\c.php
文件,这是配置文件第一个分号;
后的点C:\php\pear\c.php
决定的,如果还有很多分号,可以以此类推
步骤四:
删除C:\php\pear\c.php
,继续运行 php a.php
,输入如下:
我在 D:\a.php
我在 D:\test\b.php
我在 D:\test\c.php
这次程序读取的是D:\test\c.php
文件,是因为配置文件读取完了,找不到相关文件,然后寻找‘脚本所在的工作目录’
步骤五:
删除D:\test\c.ph
,继续运行 php a.php
,输入如下:
Fatal error: require(): Failed opening required 'c.php'
这次程序报错了,是因为配置目录与脚本工作目录都没有相关文件导致的
实验结论:
- 程序查找包含只有文件名的文件路径时,会优先根据配置的参数逐个获取寻找文件,如果找不到,就去脚本所在的工作目录下寻找;如果还找不到,就抛出上述级别的错误