PHP中"include"和"require"的区别

176

它们之间有什么区别吗?使用它们是个人偏好吗?使用其中一种是否会产生任何优势?哪一种对于安全性更好?


4
可能是什么时候应该使用require_once而不是include?的重复问题。 - Gordon
3
始终使用 "require"。 "include" 像桑拿房里的电动门一样方便。 - Marco Mariani
2
@MarcoMariani 那会有什么不方便的呢?可能很明显,只是我没有看到。 也许是蒸汽? - Austin Burk
简单来说,如果误删了'foo.php'文件,我希望尽快知道,而不是在调用本应在foo.php中的函数时才发现。将include替换为require通常可以揭示错误。假设config.php丢失,并且应用程序正在使用默认配置运行。哪个更安全?至于桑拿房,当我在里面时,如果门因某种原因无法打开,我就不喜欢它。 - Marco Mariani
7个回答

186

3
链接已损坏。 - Michael Okoli
请将以下与编程有关的内容从英语翻译成中文。只返回翻译后的文本内容,不需要附带插图的链接。 ;) - COil

151

你可以在 require 页面的详细PHP手册中找到下面的区别解释:

requireinclude 函数几乎相同,但当失败时,它会产生一个致命的E_COMPILE_ERROR级别的错误,也就是说,它将停止脚本的执行,而include只会发出警告(E_WARNING),并允许脚本继续执行。

请参考@efritz的回答获得一个示例。


6
require() 和 include() 的主要区别在于,如果你 require() 一个无法加载的文件(例如该文件不存在),那么它将生成致命错误,停止页面的执行,并且不会继续生成任何输出。而另一方面,如果你 include() 一个无法加载的文件,那么它只会生成警告,并继续构建页面。 - stormwild
3
你应该根据情况选择使用哪一种;require() 最适合加载对于页面其他部分至关重要的文件,例如如果你有一个数据库驱动的网站,则使用 require() 来包含包含数据库登录和密码的文件显然比使用 include() 更好。如果你在这种情况下使用 include(),可能会产生比你打算中更多的警告和错误。 - stormwild
3
如果$flibbertygibbet存在,那么<?php if (isset($flibbertygibbet)) require 'file.php';似乎会使得这个答案完全不正确。否则,即使条件不为真,我应该也会得到一个致命错误。strace并没有显示PHP尝试访问file.php文件。 - cHao
与include()不同,require()将始终读取目标文件,即使它所在的行从未执行。如果您想有条件地包含一个文件,请使用include()。然而,如果require()所在的行未被执行,则目标文件中的任何代码也不会被执行。这似乎是说相反的事情,还是我误解了? - lorless
1
所有这些评论都是针对此答案的原始版本,即在编辑之前。最初有一个无效的声明,声称if (false) require 'file.php'; 会导致'file.php'被加载(但不会被执行)。TLDR忽略所有这些评论。 - Kevin Wheeler

5

如果您不介意脚本继续运行而不加载文件(例如文件不存在等情况),则可以使用include,并且您可以(尽管不应该)接受显示警告错误消息。

使用require表示如果无法加载指定的文件,则您的脚本将停止,并抛出致命错误。


3
include()require() 的区别在于,如果被包含的文件找不到:include() 会发出一个警告 (E_WARNING) 且脚本会继续执行,而 require() 则会发出致命错误 (E_COMPILE_ERROR) 并终止脚本。如果所包含的文件对脚本正常运行至关重要,则需要使用 require()
更多详细信息请参见:PHP中Include和Require的区别

2

正如其他人指出的那样,唯一的区别在于 require 抛出致命错误,而 include 则是可以捕获的警告。至于使用哪个,我的建议是坚持使用 include。为什么呢?因为你可以捕获警告并为最终用户提供有意义的反馈。考虑以下:

  // Example 1.
  // users see a standard php error message or a blank screen
  // depending on your display_errors setting
  require 'not_there'; 


  // Example 2.
  // users see a meaningful error message
  try {
      include 'not_there';
  } catch(Exception $e) {
     echo "something strange happened!";
  }

注意:如果要使示例2工作,您需要安装一个错误转异常处理程序,如此处所述:http://www.php.net/manual/en/class.errorexception.php

  function exception_error_handler($errno, $errstr, $errfile, $errline ) {
     throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
  }
  set_error_handler("exception_error_handler");   

在包含层次上,发现你期望的文件不存在并不是一个很好的学习机会。在你的示例中,这两个问题都不应该推给你的网站访问者。 - Kzqai

0
<?PHP
echo "Firstline";
include('classes/connection.php');
echo "I will run if include but not on Require";
?>

一个非常简单的实用示例,附带代码。 第一个echo将被显示。无论您使用include还是require,因为它在include或require之前运行。

为了检查结果,在代码的第二行故意提供错误的文件路径或文件名中出现错误。因此,第二个echo是否显示完全取决于您使用require还是include。

如果您使用require,则不会执行第二个echo,但如果您使用include,则无论出现什么错误,都将看到第二个echo的结果。


-2

如果使用Include程序,程序不会终止并在浏览器上显示警告。另一方面,如果文件未找到,则使用Require程序将终止并显示致命错误。


你真的需要顶起一个2年半前的问题,重复已经有2/3答案提到的内容吗? - cHao
4
啊,他是新手!可能还不太了解SO(指Stack Overflow)的概念。 - Dan Hanly
可怜的用户2069222,现在他离开了SO :'( - Gagantous

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接