如果文件不存在或发生了缺点,require产生E_COMPILE_ERROR级别的缺点,程序停滞运行。
而include只产生警告,脚本会连续实行。

这便是它们最紧张的差异,其他方面require基本等同于include。

被包含文件先按参数给出的路径探求,如果没有给出目录(只有文件名)时则按照 include_path 指定的目录探求。
如果在 include_path 下没找到该文件则 include 末了才在调用脚本文件所在的目录和当前事情目录下探求如果定义了路径不管是绝对路径还是当前目录的相对路径 include_path 都会被完备忽略include_path 在php.ini中定义当一个文件被包含时,个中所包含的代码继续了 include 所在行的变量范围。
从该处开始,调用文件在该行处可用的任何变量在被调用的文件中也都可用。
不过所有在包含文件中定义的函数和类都具有全局浸染域

除了普通的require和include之外,还有require_once和include_once,他们的浸染是:

phprequirehtml彻底搞明确PHP中的include和require HTML

如果该文件中已经被包含过,则不会再次包含。
犹如此语句名字暗示的那样,只会包含一次可以用于在脚本实行期间同一个文件有可能被包含超过一次的情形下,想确保它只被包含一次以避免函数重定义,变量重新赋值等问题

我们来看些例子:

//a.php不存在include"a.php";//warning//require"a.php";//errorecho111;//利用include时111会输出//file1.php中只有一行代码echo'file1';require_once'includeandrequire/file1.php';//file1require_once'includeandrequire/file1.php';//notinginclude_once'includeandrequire/file1.php';//notinginclude_once'includeandrequire/file1.php';//notingrequire'includeandrequire/file1.php';//file1require'includeandrequire/file1.php';//file1require'includeandrequire/file1.php';//file1require'includeandrequire/file1.php';//file1

我们可以看出当第一个_once加载成功后,后面不管是require_once还是include_once,都不会再加载这个文件了。
而不带_once的则会重复加载文件。

file2.php<?phpecho'file2:'.$a,PHP_EOL;echo'file2:'.$b,PHP_EOL;$b="file2";myFile.php<?php$a='myFile';$b='youFile';require_once'includeandrequire/file2.php';echo$a,PHP_EOL;echo$b,PHP_EOL;//输出结果//file2:myFile//file2:youFile//myFile//file2file3.php<?php$c='file3';myFile.php<?phpfunctiontest(){require_once'includeandrequire/file3.php';echo$c,PHP_EOL;//file3}test();echo$c,PHP_EOL;//empty

被包含文件中可以获取到父文件中的变量,父文件也可以得到包含文件中的变量,但是,须要把稳_once的一个分外情形。

functionfoo(){require_once'includeandrequire/file3.php';return$c;}for($a=1;$a<=5;$a++){echofoo(),PHP_EOL;}//file3//empty//empty//empty//empty

利用_once并循环加载时,只有第一次会输出file3.php中的内容,这是为什么呢?由于现在的变量范围浸染域在方法中,第一次加载完成后,后面的的文件不会再被加载了,这时后面四次循环并没有\$c被定义,$c默认便是空值了。

如果两个方法中同时用_once加载了一个文件,第二个方法还会加载吗?

functiontest1(){require_once'includeandrequire/file1.php';}functiontest2(){require_once'includeandrequire/file1.php';}test1();//file1test2();//empty

抱歉,只有第一个方法会加载成功,第二个方法不会再次加载了。

那么,我们在日常的开拓中,利用哪个更好呢?

从效率来说,_once须要验证是否已经加载过文件,效率会低一些,但是并不是绝对的,乃至是我们肉眼不可见的降落,以是可以忽略它的效率问题。
而它带来的好处则比不带_once的多得多本着缺点提前的原则,利用require_once更好。
由于将PHP报错级别调度为不显示警告后,include的警告信息会不可见,会带来不可预知的缺点在方法中利用时,不应该用_once来加载文件,特殊是这个文件须要在多个类或者方法中利用时,利用_once可能会导致后面的方法中无法载相同的文件利用require或include时,最好不要用括号,虽然的确可以这么利用,如 include ('xxx.php'); 它们是表达式关键字,不是系统方法,以是直接用 include 'xxx.php' 即可

include和require的文件如果有return,可以用变量吸收retun回来的数据,其余它们还可以加载非PHP文件以及远程文件(远程加载须要确定php.ini中的allow_url_include为On),如:

file4.php<?phpreturn'file4';file4.txt可以吧myFile.php<?php$v=require'includeandrequire/file4.php';echo$v,PHP_EOL;//file4include'includeandrequire/file4.txt';//可以吧include'https://www.baidu.com/index.html';//百度首页的html代码

这下我们对付include和require的理解就非常深入了吧,这两个加载文件的办法并不繁芜,但也很随意马虎涌现一些坑,特殊是_once在方法中利用的时候一定要特殊把稳。
末了,给一个小福利,封装一个一次性加载目录中所有文件的方法:

functioninclude_all_once($pattern){foreach(glob($pattern)as$file){require$file;}}include_all_once('includeandrequire/');

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/201911/source/%E5%BD%BB%E5%BA%95%E6%90%9E%E6%98%8E%E7%99%BDPHP%E4%B8%AD%E7%9A%84include%E5%92%8Crequire.php

参考文档:

https://www.php.net/manual/zh/function.require.php https://www.php.net/manual/zh/function.include.php https://www.php.net/manual/zh/function.require-once.php https://www.php.net/manual/zh/function.include-once.php