require,include,require_once和include_once之间的区别?

Sco*_*t B 1166 php require include require-once

在PHP中:

  • 什么时候应该使用require对比include
  • 什么时候应该使用require_once对比include_once

Leo*_*Leo 1376

requireinclude_once也.

所以你的问题应该是......

  1. 什么时候应该使用require对比include
  2. 什么时候应该使用require_oncevs.require

这里描述 1的答案.

require()函数与include()相同,只是它以不同方式处理错误.如果发生错误,include()函数会生成警告,但脚本将继续执行.require()生成致命错误,脚本将停止.

2的答案可以在这里找到.

require_once()语句与require()相同,但PHP将检查文件是否已被包含,如果已包含,则不再包括(require)它.

  • @DiAlex ......如果事实证明该文件已经包含在内,那么`require_once()`将会更快 (72认同)
  • 请注意,require()的执行速度比require_once()快,所以如果你确定没有重复的包含,请使用require(). (50认同)
  • @DiAlex,require_once较慢,但几乎无法测量. (48认同)
  • @WeishiZeng对于网页,可能存在您想要多次包含的HTML片段. (17认同)
  • @Prof.Falken在什么情况下需要多次需要同一个文件?在我目前的思维模式中,我无法想到一个. (11认同)
  • 在大型代码库中,可以在多个位置要求/包含配置文件,以进行测试或重用.通过使用_once你可以避免它咬你的屁股. (7认同)
  • @WeishiZeng我之前从未想过任何理由......但是当你问,如果所需的代码不仅定义了函数和常量,还执行代码怎么办?但这不是一个好的编程实践. (3认同)
  • 也许文件`require`d也被另一个包含/要求的文件`require`d? (3认同)
  • 同时具有require/include和require_once/include_once的原因是提供"性能多样性".如果只存在'require_once',那么选择使用[也许]更快的'require'将不存在.关于"什么时候需要更多需要一次?"的问题,请考虑涉及多个团队的大规模开发工作.很难保持协调."require_once"的能力消除了可能成为后勤噩梦的一定程度的复杂性.在这样的环境中工作的任何人都知道编码标准符合性的水平;). (3认同)
  • @JoachimRives 每次请求页面时都会加载所有相关的 PHP 代码。所以基本上,如果 100 个用户从不同的计算机加载“脚本”,当然,该脚本将被包含 100 次,因为每个“会话”都是独立的。 (3认同)
  • @Frof.Falken那可能是一个案子吧?但它应该有其他主要原因才有意义. (2认同)

Gor*_*don 396

使用


  • 当您的应用程序需要该文件时需要,例如重要的消息模板或包含配置变量的文件,如果没有该配置变量,应用程序将会中断.

  • require_once
    当文件包含会在后续包含时产生错误的内容,例如 function important() { /* important code */}在您的应用程序中肯定需要,但由于无法重新声明函数,因此不应再次包含.

  • 包括 何时不需要文件,应用程序流应该在未找到时继续,例如,
    对于引用当前范围或其他内容的变量的模板非常有用

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

但基本上,由你来决定何时使用哪个.

  • 如果没有必要,请告诉我为什么要包括它? (9认同)
  • 这应该是接受的答案,因为它简短地回答了问题,并链接到官方手册,而不是仅连接w3schools的其他答案. (6认同)
  • 感谢您将信息放入实际答案中,而不是让我点击更多链接来查找它。 (2认同)

Kzq*_*qai 294

我的建议是只使用require_once99.9%的时间.

使用requireinclude代替暗示您的代码在其他地方不可重用,即您所引入的脚本实际上是执行代码而不是提供类或某些函数库.

如果您需要/包括在现场执行的代码,那是程序代码,您需要了解新的范例.像面向对象编程,基于函数的编程或函数编程.

如果您已经在进行OO或函数式编程,那么使用include_once大多数情况会延迟堆栈中的错误发现.您是否想知道do_cool_stuff()当您稍后致电该功能时,或者您希望通过要求库可以获得该功能时,该功能是否可用?一般来说,最好立即知道您需要和期望的东西是否可用,所以只需使用即可require_once.

或者,在现代OOP中,只需在使用时自动加载您的课程.

  • +1这应该是接受的答案.关键点是`include`系列通常是一个彻头彻尾的坏主意(因为包含任何可能不存在的文件很少见),而且``require_once`和`require`,你应该使用` require_once`包含*define*函数或类在其他地方使用的文件,或实例化单例如数据库连接对象,并使用`require`包含立即*包含*的文件.在任何大型Web应用程序中,后一类包含都是不寻常的. (40认同)
  • +1(有另一个金徽章;))同意明智的`require_once`几乎是所有时间都可能被使用的候选人.鉴于选择之间的微小开销差异,`require`确保脚本停止,我无法想到许多情况下应用程序可以在没有包含文件的情况下生存.并且`_once`可以防止欺骗问题.任何不同意的人都可能知道他们在做什么,所以可以选择适合应用程序或场景的人. (7认同)
  • 在现代 PHP 中,99.9% 的时间你不需要 _once,所以它变成了 require。 (2认同)

Seb*_*ian 35

_once函数和没有_once函数之间的区别:不再使用_once代码,而使用_once函数,PHP会跟踪包含的文件,并且只包含一次.

require和include之间的区别:如果找不到所需的文件,PHP将发出致命错误,而对于include,只会发出警告.


Pol*_*ial 31

include() 如果它不能包含该文件,则会发出警告,但脚本的其余部分将运行.

require()E_COMPILE_ERROR如果脚本不能包含该文件,则会抛出并暂停该脚本.

include_once()require_once()功能将不包括在文件中的第二次,如果已经被列入了.

请参阅以下文档页面:


Ali*_*sin 22

无论何时使用require_once()都可以在文件中使用,以便在当前文件中只需要一次调用时调用另一个文件.在这个示例中,我有一个test1.php.

<?php  
echo "today is:".date("Y-m-d");  
?>  
Run Code Online (Sandbox Code Playgroud)

在另一个名为test2.php的文件中

<?php  
require_once('test1.php');  
require_once('test1.php');  
?>
Run Code Online (Sandbox Code Playgroud)

因为你正在看m需要test1文件两次,但文件将包含test1一次,而在第二次调用时,这将被忽略.没有停止会一次显示输出.

无论何时使用'include_once(),当您在当前文件中多次需要被调用文件时,可以在文件中使用`来包含另一个文件.在这个示例中,我有一个名为test3.php的文件.

<?php  
echo "today is:".date("Y-m-d");  
?> 
Run Code Online (Sandbox Code Playgroud)

在另一个我命名为test4.php的文件中

<?php  
include_once('test3.php');  
include_once('test3.php');  
?>
Run Code Online (Sandbox Code Playgroud)

当你正在观看包含test3文件的m将包含文件一次但停止进一步执行.


mo.*_*mo. 19

使用"include"表示可重用的PHP模板.对所需的库使用"require".

"*_once"很好,因为它检查文件是否已经加载,但它只对我有用"require_once".


PHP*_*Pst 16

2018年7年后的答案

这个问题是七年前提出的,没有一个答案为这个问题提供实际帮助.在现代PHP编程中,您主要required_once只使用一次自动加载器类(通常是编写器自动加载器),它将加载所有类和函数(函数文件需要显式添加到composer.json文件中以便在所有其他文件中可用).如果由于任何原因您的类无法从自动加载器加载,您可以使用require_once它来加载它.

这些天你require只使用拆分大块的PHP文件.这主要是一个大数组定义.在这种情况下,你只能使用requirerequire_once.

 <?php
// arr.php
return ['x'=>'y'];

 <?php
//main.php
$arr= require 'arry.php'
Run Code Online (Sandbox Code Playgroud)

如果您打算使用的文件包含可执行文件或声明某些变量,您几乎所有时间都需要使用include,因为如果您include_once在其他地方使用您的代码将不会被执行和/或您的变量将无法以静默方式启动,从而导致错误绝对难以确定.

没有实际的使用情况required_oncecomposer.json真.


Fel*_*ing 15

不同之处在于命令生成的错误.有了require,你想要使用的文件确实是必需的,因此E_ERROR如果找不到它就生成一个.

require()是相同的include() 失败时它也将产生致命的除外E_ERROR 电平误差.

include只有E_WARNING在失败或多或少无声的情况下才会生成错误.

因此,如果需要该文件使剩余代码工作并且您希望脚本失败,则使用它,该文件不可用.


用于*_once():

include_once() 可以在特定执行脚本期间可能包含和评估多个文件的情况下使用,因此在这种情况下,它可以帮助避免诸如函数重新定义,变量值重新分配等问题.

同样适用于require_once()课程.


参考:require(),include_once()


Tib*_*tan 14

您应该将类​​和函数定义保存在文件中.

使用require_once()加载依赖关系(类,函数,常量).

使用require()加载类似模板文件.

使用include_once()加载可选依赖(类,函数,常量).

使用include()加载可选的类似模板文件.


小智 10

1 - 如果文件不存在,“require”和“require_once”会抛出致命错误并停止脚本执行

2 - “include”和“include_once”抛出警告并继续执行

3 - “require_once”和“include_once”顾名思义,如果文件已包含在“require”、“require_once”、“include”或“include_once”中,则它们不会包含该文件


小智 9

使用require文件必须存在,如果没有,则会显示错误; 而使用include - 如果文件不存在则则页面将继续加载.


You*_*nse 8

需要关键部件,如授权,包括所有其他部件.

多个包含只是非常糟糕的设计,必须完全避免.所以,*_once并不重要.


Mar*_*rcx 7

包含/要求您可以多次包含同一文件:

require()与include()相同,除非失败,它还会产生致命的E_COMPILE_ERROR级别错误.换句话说,它将暂停脚本,而include()仅发出警告(E_WARNING),允许脚本继续.

require_once/include_once

与include/require相同,但PHP将检查文件是否已被包含,如果已包含,则不再包括(require)它.


Aks*_*ale 7

 

  1. 什么时候应该使用requireinclude

    requireinclude功能执行相同任务,即包括并运行指定文件,但不同的是require会造成致命的错误时,指定的文件位置是无效或对任何错误,而include会产生警告,并继续执行代码。

    因此require,如果您尝试包含的文件是系统核心,并且可能对其余代码产生巨大影响,则您可以使用该include函数,并且当您尝试包含的文件是一个包含一些不太重要的代码的简单文件。

    我个人的建议(对于不太重要的代码)是require在开发阶段的代码中到处使用该功能,以便您可以调试代码,然后在将其移至生产之前requireinclude功能替换所有功能,以便如果您错过任何错误都不会影响最终用户,其余代码可以正常执行...

  2. 什么时候应该使用require_oncerequire

    requirerequire_onceis之间的基本区别require_once将检查文件是否已经被包含,如果它已经被包含,那么它不会包含该文件,而require无论文件是否已包含函数都将包含该文件。

    因此,如果您想一次又一次require地包含一些代码,请使用该函数,而如果您只想在代码中包含一些代码,请使用require_once.


pcj*_*pcj 7

我使用的功能如下:

function doSomething() {
    require_once(xyz.php);
    ....
}
Run Code Online (Sandbox Code Playgroud)

在 xyz.php 中声明了常量值。

我必须从另一个 PHP 脚本文件调用这个 doSomething() 函数。

但是我观察到在循环中调用此函数时的行为,第一次迭代 doSomething() 在 中获得常量值xyz.php,但后来每次迭代doSomething()都无法获得声明中的常量值xyz.php

我通过从require_once()to切换解决了我的问题include(),更新后的doSomething()代码如下:

function doSomething() {
    include(xyz.php);
    ....
}
Run Code Online (Sandbox Code Playgroud)

现在,每次迭代调用doSomething()都会获取 中定义的常量值xyz.php


Fer*_*yer 5

手册

require()与 相同,include()除了在失败时它也会产生致命的E_COMPILE_ERROR级别错误。换句话说,它会停止脚本,而include()只发出警告 ( E_WARNING) 允许脚本继续。

_once()变体也是如此。


Ruk*_*tel 5

include()当它找不到文件时会生成警告,但require_once()会产生致命错误.

另一件事是如果之前包含文件.然后require_once()不会再包括它.