php中require和include区别详解

学习和解决问题的过程中,总是少不了在网上参考前辈的文章,但如今的互联网,文章都是千篇一律的抄,连验证都不验证一下。提起require和include的区别,网上绝大多数文章都提到1…2…3…!但真的是那样子吗?今天专门测试确认了一下。不造谣、不传谣,当今技术文章质量可真让人捉急…

提起php中require和include区别,网上绝大多数都提到3点:
1.处理错误方式不同:require加载的文件不存在时报出致命错误程序退出,include加载的文件不存在时报出警告信息程序继续执行。
2.返回值不同:include有返回值,require没有返回值。
3.流程控制不同:require不受if等流程控制影响,即无条件加载,include受if等流程控制影响,有条件加载。
但是,真的是这样吗?下面我们针对三条各做个测试来验证
先创建个文件用于包含测试
server.php代码

<?php
$param = "require和include有什么区别呢?";
return $param;

1.处理错误方式真的不同吗?
require测试

<?php
$param = "require和include有区别";
require "server1.php";
var_dump($param);

输出

Warning: require(server1.php): failed to open stream: No such file or directory in E:\repository\work\study\test0305.php on line 3

Fatal error: require(): Failed opening required 'server1.php' (include_path='.;C:\php\pear') in E:\repository\work\study\test0305.php on line 3

由于测试的require文件没有路径,所以php先去include_path中寻找,没有则报了一个警告,再去脚本当前目录寻找,依然没有这个文件,则报致命错误终止执行而退出
include测试

<?php
$param = "require和include有区别";
include "server1.php";
var_dump($param);

输出

Warning: include(server1.php): failed to open stream: No such file or directory in E:\repository\work\study\test0305.php on line 3

Warning: include(): Failed opening 'server1.php' for inclusion (include_path='.;C:\php\pear') in E:\repository\work\study\test0305.php on line 3
string(26) "require和include有区别"

php先去include_path中寻找,没有则报了一个警告,再去脚本当前目录寻找,依然没有这个文件,又报个警告,但脚本继续执行并打印了$param变量,由此可见处理错误方式真的不同
2.include有返回值,require没有返回值?
require测试

<?php
$param = "require和include有区别";
$ret = require "server.php";
var_dump($ret);

输出

string(38) "require和include有什么区别呢?"

我去…$ret竟然不是null,收到了返回值…
include测试

<?php
$param = "require和include有区别";
$ret = include "server.php";
var_dump($ret);

输出

string(38) "require和include有什么区别呢?"

有返回值,由此可见include和require都是有返回值的
3.流程控制不同?
require测试

<?php
$param = "require和include有区别";
if (false){
    $ret = require "server.php";
}
var_dump($param);

输出

string(26) "require和include有区别"

谣言再次被戳破,条件不成立时,require并没有被执行。
include测试

<?php
$param = "require和include有区别";
if (false){
    $ret = include "server.php";
}
var_dump($param);

输出

string(26) "require和include有区别"

由此可见,require和include都受到流程控制影响
最终结论,不考虑底层的情况下,require和include表现出的区别仅有一条,处理错误方式不同
自古文人是一家,你不抄我我抄他,但请拜托,抄之前应该实操一下。