PHP require和include有什么区别?

19

我知道PHP中require、require_once、include和include_once的基本用法,但我困惑于何时应该使用它们。

例如:我有3个文件,例如:settings.php、database.php和index.php。

在database.php文件中,我写了:

require_once 'settings.php';

然后在index.php中,我写了:

require_once 'settings.php';
require_once 'database.php';

我加载了两次settings.php文件,这样可以吗?有什么使用这些函数的技巧吗?

8个回答

24
  • include 包含一个文件,如果该文件未找到,则抛出警告。

  • require 包含一个文件,如果该文件未找到,则抛出致命错误。

  • include_oncerequire_once 做的事情是一样的,但仅在文件未被加载时才这样做。

然而,需要使用其中一个_once函数通常是糟糕设计的标志。您应该以一种清晰的方式构建脚本,明确定义哪些内容包含在何处。

选择一个地方来包含settings.php - 可能是index.php。不应额外在database.php中再次包含它。


8
尽管我有些挑剔/个人看法:我不认为“需要使用_once函数之一通常表明设计不良”。毕竟,自动加载器基本上也是这样做的。我会说应该始终将_once用于仅包含函数/类/常量声明的文件,而将其他用于脚本片段。在这种情况下,使用_once通常[!]表明设计不良。如果没有自动加载器,_once(允许代码相当模块化)可以使您的代码变得更好。 (在这种特殊情况下,我同意首先只应包含一个_once。) - pinkgothic
1
@pinkgothic 我不得不反驳一下。自动加载器的工作原理相同,但是如果它们值得它们的盐,它们会在尝试包含之前进行class_exists()检查。根据我的经验(也就是自己的经验!),require_once()通常意味着“我不确定这个文件是否已经在其他地方被包含了,因为我没有完全掌握我的项目结构。”就我所见,任何其他使用_once的情况都可以通过检查我即将包含的资源是否已经存在来防止 - 无论是函数还是类。 - Pekka
话虽如此,我相信有些情况下使用 _once 是更快、更高效的解决方案。 - Pekka
同意,你可以将你的包含/需要包装到if块中,但这与PHP内部执行的工作相同(好吧,不是完全相同的工作,但是原理相同),并且在此过程中变得不太可读。最终,这是一个哲学问题。我的哲学恰好与你的相反...可能主要是因为我的经验也是相反的。然而,归根结底,我相信我们会揍同样的人。 :)) - pinkgothic
@pinkgothic 说得好!确实,我们可能从(表面上)不同的方向追求相同的目标。 :) - Pekka

3
根据PHP require_once文档,不要重复加载settings.php;

require_once()语句与require()相同,只是PHP会检查文件是否已经被包含,如果是,则不会再次包含(require)它。


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

1
  • require
    当应用程序需要该文件时,例如重要的消息模板或包含配置变量的文件,如果没有这些变量,应用程序将无法正常运行。

  • require_once
    当文件包含的内容会在后续的引入中产生错误时,例如function important() { /* important code */}是应用程序中必需的,但由于函数不能被重新声明,因此不应再次包含它。

  • include
    当文件不是必需的且应用程序流程应在未找到文件时继续进行时,例如用于从当前范围引用变量的模板等。

  • include_once
    可选依赖项,这些依赖项在后续加载时会产生错误,或者可能是远程文件包含,由于HTTP开销,您不希望发生两次。


0

区别:

include() 获取数据并加载当前文件中的内容,也可以多次加载同一文件。

include_once()include()相同,但如果文件已经被包含,则使用include_once()不会再次包含它。 如果在类似以下情况下多次使用同一文件:include_once 'setting.php';第二次使用include_once 'settting.php';将忽略它们。

require() 与 include() 相同。

require_once() 如果文件已经被包含,则不会再次包含它。

include()include_once() 会产生警告,并且脚本将继续执行。

require()require_once() 会产生致命错误并停止脚本。

最好在您的脚本中使用

require_once()


-1

require_once 会检查文件是否已经被包含,如果已经被包含就不会再次包含,所以不用担心它会加载两次 settings.php


-1
如果你的文件很重要,我认为你应该使用 "require", 但如果不是,我总是使用 include,就像 peka 的回答一样。 require 包含一个文件,并在找不到文件时抛出致命错误。

-2

在Php中,include_once和require_once用于将一个页面添加到另一个页面的示例中:例如,您想在编辑页面edit.php中添加数据库连接页面conn.php,则可以使用它。 但是,include_once和require_once之间存在不同,如果include_once函数出现任何错误,它会警告您并执行代码,但是如果require_once函数发现任何错误,它将停止脚本并不执行代码。


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