PHP中“ include”和“ require”之间的区别


174

它们之间有什么区别吗?是否优先使用它们?将一个使用在另一个上是否有任何优势?哪种安全性更好?



3
始终使用“要求”。“包含”与桑拿浴室中的电动门一样方便。
Marco Mariani'9

2
@MarcoMariani会带来什么不便?可能很清楚,我只是没有看到它。也许是蒸汽?
奥斯汀·伯克

简而言之,如果错误地丢失了“ foo.php”文件,我想尽快知道,而不是何时调用本应在foo.php中的函数。将include替换为require常常会发现错误。假设缺少config.php,并且应用程序以默认配置运行。哪种安全性更好?至于桑拿,当我在里面并且门由于某种原因无法打开时,我不喜欢它。
Marco Mariani 2014年

Answers:


148

您可以在以下页面require的详细PHP手册中找到差异:

require等同include于失败,也会产生致命的E_COMPILE_ERROR错误。换句话说,它将停止脚本,而include仅发出警告(E_WARNING),该警告允许脚本继续运行。

有关示例,请参见@efritz的答案


6
tiposaurus.co.uk/2011/04/04/… ““ require()和include()之间的主要区别在于,如果require()是无法加载的文件(例如,如果文件不存在),则它会产生一个致命错误,该错误将完全停止页面的执行,并且将不再生成任何输出。另一方面,如果include()一个无法加载的文件,则只会生成警告并继续构建页面。”
Stormwild 2012年

3
“您应该使用哪种方式取决于情况; require()最适合加载页面其余部分必不可少的文件-例如,如果您有数据库驱动的网站,则使用require()包含包含以下内容的文件:数据库登录名和密码显然比使用include()更可取。如果在这种情况下使用include(),则最终可能会产生比预期更多的警告和错误。”
暴风雨2012年

3
<?php if (isset($flibbertygibbet)) require 'file.php';似乎会使这个答案看起来完全不正确。否则,即使条件不正确,我也应该收到致命错误。 strace即使尝试触摸也不显示PHP file.php
cHao

与include()不同,require()始终会读入目标文件,即使它所在的行从不执行。如果要有条件地包含文件,请使用include()。AND,但是,如果没有执行require()所在的行,则目标文件中的任何代码也不会执行。似乎在说相反的话,还是我误会了?
lorless

1
所有这些注释均指的是该答案在被编辑之前的原始版本。最初有一个无效的声明,声称if (false) require 'file.php';将导致加载“ file.php”(但未执行)。TLDR忽略了所有这些评论。
凯文·惠勒


5

使用include,如果你不介意你的脚本继续而不加载文件(如果它不存在等),你可以(虽然你不应该)现场用警告的错误信息被显示。

使用require表示脚本无法加载指定文件时将暂停,并引发致命错误。


2

正如其他人指出的那样,唯一的区别是require会引发致命错误,并包括-可捕获的警告。至于要使用哪一个,我的建议是坚持使用。为什么?因为您可以收到警告并向最终用户提供有意义的反馈。考虑

  // 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正常工作,您需要安装一个error-to-exceptions处理程序,如此处所述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 2015年

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

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

要检查结果,请在代码的第二行中有意提供错误的文件路径或使文件名出错。因此,要显示或不显示的第二个回声将完全取决于您使用require还是include

如果您使用require,则第二个回显将不会执行,但是如果您使用include不管出现什么错误,您也会看到第二个回显的结果。


-2

如果包含程序将不会终止并在浏览器上显示警告,另一方面,如果找不到文件,则要求程序将终止并显示致命错误。


您是否真的必须提出一个2 1/2年的问题来重复已经回答过的2/3的问题...?
cHao

4
噢,他是新手!可能还不了解SO的概念。
丹·汉利

可怜的user2069222,现在他离开了:'(
硕大的
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.