在PHP中,有两种包含外部文件的方式,分别是include和require。他们之间有什么不一样呢?php
若是文件不存在或发生了错误,require产生E_COMPILE_ERROR级别的错误,程序中止运行。而include只产生警告,脚本会继续执行。html
这就是它们最主要的区别,其余方面require基本等同于include。git
除了普通的require和include以外,还有require_once和include_once,他们的做用是:github
咱们来看些例子:微信
// a.php 不存在 include "a.php"; // warning // require "a.php"; // error echo 111; // 使用include时111会输出 // file1.php 中只有一行代码echo 'file1'; require_once 'includeandrequire/file1.php'; // file1 require_once 'includeandrequire/file1.php'; // noting include_once 'includeandrequire/file1.php'; // noting include_once 'includeandrequire/file1.php'; // noting require 'includeandrequire/file1.php'; // file1 require 'includeandrequire/file1.php'; // file1 require 'includeandrequire/file1.php'; // file1 require 'includeandrequire/file1.php'; // file1
咱们能够看出当第一个_once加载成功后,后面不论是require_once仍是include_once,都不会再加载这个文件了。而不带_once的则会重复加载文件。函数
file2.php <?php echo '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 // file2 file3.php <?php $c = 'file3'; myFile.php <?php function test(){ require_once 'includeandrequire/file3.php'; echo $c, PHP_EOL; // file3 } test(); echo $c, PHP_EOL; // empty
被包含文件中能够获取到父文件中的变量,父文件也能够得到包含文件中的变量,可是,须要注意_once的一个特殊状况。学习
function foo(){ require_once 'includeandrequire/file3.php'; return $c; } for($a=1;$a<=5;$a++){ echo foo(), PHP_EOL; } // file3 // empty // empty // empty // empty
使用_once并循环加载时,只有第一次会输出file3.php中的内容,这是为何呢?由于如今的变量范围做用域在方法中,第一次加载完成后,后面的的文件不会再被加载了,这时后面四次循环并无$c被定义,$c默认就是空值了。测试
若是两个方法中同时用_once加载了一个文件,第二个方法还会加载吗?ui
function test1(){ require_once 'includeandrequire/file1.php'; } function test2(){ require_once 'includeandrequire/file1.php'; } test1(); // file1 test2(); // empty
抱歉,只有第一个方法会加载成功,第二个方法不会再次加载了。url
那么,咱们在平常的开发中,使用哪一个更好呢?
include和require的文件若是有return,能够用变量接收retun回来的数据,另外它们还能够加载非PHP文件以及远程文件(远程加载须要肯定php.ini中的allow_url_include为On),如:
file4.php <?php return 'file4'; file4.txt 能够吧 myFile.php <?php $v = require 'includeandrequire/file4.php'; echo $v, PHP_EOL; // file4 include 'includeandrequire/file4.txt'; // 能够吧 include 'https://www.baidu.com/index.html'; // 百度首页的html代码
这下咱们对于include和require的了解就很是深刻了吧,这两个加载文件的方式并不复杂,但也很容易出现一些坑,特别是_once在方法中使用的时候必定要特别注意。最后,给一个小福利,封装一个一次性加载目录中全部文件的方法:
function include_all_once ($pattern) { foreach (glob($pattern) as $file) { require $file; } } include_all_once('includeandrequire/*');
关注公众号:【硬核项目经理】获取最新文章
添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料
知乎、公众号、抖音、头条搜索【硬核项目经理】
B站ID:482780532