经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » PHP » 查看文章
彻底搞明白PHP中的include和require
来源:cnblogs  作者:硬核项目经理  时间:2021/2/1 12:02:42  对本文有异议

在PHP中,有两种包含外部文件的方式,分别是include和require。他们之间有什么不同呢?

如果文件不存在或发生了错误,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,他们的作用是:

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

我们来看些例子:

  1. // a.php 不存在
  2. include "a.php"; // warning
  3. // require "a.php"; // error
  4. echo 111; // 使用include时111会输出
  5. // file1.php 中只有一行代码echo 'file1';
  6. require_once 'includeandrequire/file1.php'; // file1
  7. require_once 'includeandrequire/file1.php'; // noting
  8. include_once 'includeandrequire/file1.php'; // noting
  9. include_once 'includeandrequire/file1.php'; // noting
  10. require 'includeandrequire/file1.php'; // file1
  11. require 'includeandrequire/file1.php'; // file1
  12. require 'includeandrequire/file1.php'; // file1
  13. require 'includeandrequire/file1.php'; // file1

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

  1. file2.php
  2. <?php
  3. echo 'file2:' . $a, PHP_EOL;
  4. echo 'file2:' . $b, PHP_EOL;
  5. $b = "file2";
  6. myFile.php
  7. <?php
  8. $a = 'myFile';
  9. $b = 'youFile';
  10. require_once 'includeandrequire/file2.php';
  11. echo $a, PHP_EOL;
  12. echo $b, PHP_EOL;
  13. // 输出结果
  14. // file2:myFile
  15. // file2:youFile
  16. // myFile
  17. // file2
  18. file3.php
  19. <?php
  20. $c = 'file3';
  21. myFile.php
  22. <?php
  23. function test(){
  24. require_once 'includeandrequire/file3.php';
  25. echo $c, PHP_EOL; // file3
  26. }
  27. test();
  28. echo $c, PHP_EOL; // empty

被包含文件中可以获取到父文件中的变量,父文件也可以获得包含文件中的变量,但是,需要注意_once的一个特殊情况。

  1. function foo(){
  2. require_once 'includeandrequire/file3.php';
  3. return $c;
  4. }
  5. for($a=1;$a<=5;$a++){
  6. echo foo(), PHP_EOL;
  7. }
  8. // file3
  9. // empty
  10. // empty
  11. // empty
  12. // empty

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

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

  1. function test1(){
  2. require_once 'includeandrequire/file1.php';
  3. }
  4. function test2(){
  5. require_once 'includeandrequire/file1.php';
  6. }
  7. test1(); // file1
  8. test2(); // 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),如:

  1. file4.php
  2. <?php
  3. return 'file4';
  4. file4.txt
  5. 可以吧
  6. myFile.php
  7. <?php
  8. $v = require 'includeandrequire/file4.php';
  9. echo $v, PHP_EOL; // file4
  10. include 'includeandrequire/file4.txt';
  11. // 可以吧
  12. include 'https://www.baidu.com/index.html';
  13. // 百度首页的html代码

这下我们对于include和require的了解就非常深入了吧,这两个加载文件的方式并不复杂,但也很容易出现一些坑,特别是_once在方法中使用的时候一定要特别注意。最后,给一个小福利,封装一个一次性加载目录中所有文件的方法:

  1. function include_all_once ($pattern) {
  2. foreach (glob($pattern) as $file) {
  3. require $file;
  4. }
  5. }
  6. 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

关注公众号:【硬核项目经理】获取最新文章

添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料

知乎、公众号、抖音、头条搜索【硬核项目经理】

B站ID:482780532

原文链接:http://www.cnblogs.com/zyblog-coder/p/14348121.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号