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


Answers:


1426

也有requireinclude_once

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

  1. 我什么时候应该使用requirevs.include
  2. 我什么时候应该使用require_oncevs.require

这里描述1的答案。

require()函数与include()相同,不同之处在于它对错误的处理方式不同。如果发生错误,include()函数将生成警告,但脚本将继续执行。require()产生致命错误,脚本将停止。

这里可以找到2的答案。

require_once()语句与require()相同,除了PHP会检查文件是否已被包含,如果不包含,将不再对其进行包含(require)。


58
请记住,require()的执行速度比require_once()快,因此,如果您确定没有重复的包含,请使用require()。
Dialex 2012年

48
@ DiAlex,require_once较慢,但几乎不可测量。
Falken教授的合同

77
@DiAlex ...,而且,如果发现该文件实际上已经包含在内,require_once()则将是两者中比较快的文件
Tom

11
@ Prof.Falken在什么情况下需要一个以上的文件多次?我无法在目前的思维定势中想到一个。
曾伟石

17
@WeishiZeng对于网页,可能有多个HTML片段要包含多个。
詹姆斯·贝宁格

406

采用

  • 需要
    时,该文件要求您的应用程序,例如,一个重要的信息模板或没有这些应用程序将打破一个包含文件中的配置变量。


  • 当文件包含的内容在随后的包含时会产生错误的内容时,例如function important() { /* important code */},在您的应用程序中绝对需要,但由于不能重新声明函数,则不再需要包含 require_once

  • 在不需要文件时包括在内,并且在找不到文件时应继续使用应用程序流,例如,
    对于引用当前作用域或其他内容的模板非常有用

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

但基本上,什么时候使用取决于您。


我有一个PDO连接(到数据库)。我应该使用哪个?includeinclude_oncerequirerequire_once
Shafizadeh '16

6
这应该是公认的答案,因为它简短地回答了该问题并链接到了官方手册,而不是仅链接w3schools的其他答案。
Daniel W.

9
请给我一个理由,如果不需要的话为什么要包含它?
弗朗西斯科·奥乔

1
我使用的模板具有通用页面布局,该页面具有诸如标题,列,页脚等部分。这使我可以为网站上的每个页面提供该模板,而我只需要在页面文件夹结构中创建文件来定义应该进入每个位置。如果我确定某个页面不需要侧边栏,则只需将该文件放在该页面的文件夹中即可,并且该模板在没有该文件的情况下仍然可以正常工作。
James Coyle

301

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

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

如果您需要/包括当场执行的代码,那么这就是程序代码,并且您需要了解新的范例。类似于面向对象的编程,基于函数的编程或函数式编程。

如果您已经在进行面向对象的编程或函数式编程,则使用include_once它通常会延迟在堆栈中发现错误/错误的位置。您是否想知道该函数do_cool_stuff()在以后去调用时是不可用的,还是在您要求通过使用库来使它可用的那一刻不可用?通常,最好立即知道您需要和期望的东西是否不可用,因此请使用require_once

另外,在现代OOP中,只需在使用时自动加载您的类即可。


41
+1这应该是公认的答案。关键是include家族通常是一个绝妙的主意(因为很少包含可能不存在的文件),而在require_once和中requirerequire_once当包含定义函数或类的文件时应使用在其他地方使用,或实例化数据库连接对象之类的单例,并require用于包含文件,这些文件在被包含时立即起作用。在任何大型Web应用程序中,后一种包含都是不常见的。
Mark Amery 2013年

7
+1(还有另一个金牌;))同意明智的选择require_once是几乎所有时间都在使用它。由于选择之间的开销差异很小,require可确保脚本停止运行,因此我无法想到许多情况下应用程序可以在不包含文件的情况下生存下来的情况。并_once保护免受欺骗问题。任何不同意的人都可能知道自己在做什么,可以选择适合该应用程序或方案的任何一种。
2014年

嘿,我有一个有时包含在索引页中的文件,并且直接调用了man time(home.php).......现在我已经在索引页中包含了具有require函数的配置文件,现在可以使用require_once在home.php防止再包括
Ravinder PAYAL

@RavinderPayal好吧,我的第一个建议是使用前置控制器来避免头痛!仅仅因为用户调用example.com/home并不意味着您应该拥有一个完全独立的home.php!相反,/ home /应该只通过index.php或front.php的前端控制器进行路由。只有php才真正允许老式的“每页一个脚本”方法,并且相信我,这不是最好的方法。但是,如果您必须有单独的home.php和index.php,则所有可能同时存在的内容都应位于库文件或模板中,即../templates/home.tpl或../view/home.view.php你懂?
2015年

它的SNS和我最初选择一个文件一页的方法是为了易于开发,而我无法重新创建它的一大堆文件,现在我解决了这个问题,而使一个文件一页的另一个原因是速度快,并且与硬盘的接触较少的数量减少包括
Ravinder PAYAL

36

_once函数与不具有_once函数之间的区别:不具有_once代码将再次被包含,而具有_once函数的PHP将跟踪包含的文件,并且仅包含一次。

require和include之间的区别:如果未找到所需文件,PHP将发出致命错误,而对于include则仅发出警告。


1
哇,简短而简单!
弗拉德

31

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

require()E_COMPILE_ERROR如果无法包含该文件,则会抛出一个脚本并停止该脚本。

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

请参阅以下文档页面:


22

require_once()当您只需要在当前文件中一次使用被调用文件时,无论何时使用,都可以在一个文件中使用它来包含另一个文件。在此示例中,我有一个test1.php。

<?php  
echo "today is:".date("Y-m-d");  
?>  

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

<?php  
require_once('test1.php');  
require_once('test1.php');  
?>

当您观看m两次需要test1文件时,但是该文件将一次包含test1,第二次调用时将忽略该文件。并且在不停止的情况下将一次显示输出。

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

<?php  
echo "today is:".date("Y-m-d");  
?> 

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

<?php  
include_once('test3.php');  
include_once('test3.php');  
?>

如您所见,包含test3文件的m会一次包含该文件,但会停止进一步执行。


“比建议更好的例子”
Ramesh Kithsiri HettiArachchi'1

19

使用“ include”可重复使用的PHP模板。对必需的库使用“ require”。

“ * _once”很不错,因为它检查文件是否已经加载,但是仅对“ require_once”有意义。


18

您应该将类​​和函数定义组织在文件中。

使用require_once()负载依赖性(类,函数,常量)。

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

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

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


16

7年后的2018年答案

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

在某些情况下,我们需要使用require。例如,如果您有很大的数组定义,并且不想将其添加到类定义源代码中,则可以:

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

 <?php
//main.php
$arr= require 'arry.php'

如果要包含的文件包含可执行文件或声明了一些变量,则几乎总是需要使用require,因为如果您require_once与第一个地方分开使用,则代码将不会被执行和/或变量不会以静默方式启动,从而导致错误很难确定。

没有实际的使用情况includeinclude_once真。


+1表示自动装带器。但是,最后一句话是有争议的。通常,您会include()在输出缓冲区中使用,来实现模板引擎。
haz

同样,在现代文本编辑器和现代PHP的情况下,几乎没有人使用require()过拆分大文件的功能。
haz

require_once在函数内部使用PHPMailer 时,我遇到了同样的问题,而我的自动加载器$mail在代码的后面定义了所需的变量,因此下一个require_once将被忽略,而这个变量$mail尚未初始化!解决方案是require在函数调用后简单使用。
Youssef

@haz require在这些情况下,您是否有任何不使用的理由?
PHPst

@ChristofferBubach哈哈。
PHPst

15

区别在于命令生成的错误。使用时require,实际上需要使用要使用的文件,E_ERROR如果找不到该文件,则会生成一个。

require()等同include() 于失败,也会产生致命的E_ERROR 错误。

includeE_WARNING在失败时产生错误,该错误或多或少是无声的。

因此,如果需要使用文件才能使其余代码正常工作,并且您希望脚本失败,请使用该文件不可用。


对于*_once()

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

require_once()当然,这同样适用。


参考:require()include_once()


require给出E_COMPILE_ERROR,而不是E_ERROR。
Yousha Aleayoub

看起来在过去7年中发生了变化。
Felix Kling

9

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


8

需要关键部分,例如授权,并包括所有其他部分。

多个包含项只是非常糟糕的设计,必须完全避免。因此,* _ once并不重要。


7

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

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

require_once / include_once

与include / require相同,不同之处在于PHP将检查文件是否已被包含,如果不包含,将不再对其进行包含(要求)。


5

include()找不到文件时将生成警告,但require_once()会生成致命错误。

另一件事是如果以前包含文件。然后require_once()将不再包含它。


5

我正在使用如下功能:

function doSomething() {
    require_once(xyz.php);
    ....
}

xyz.php中声明了常量值。

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

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

我通过交换解决我的问题require_once()include(),更新的doSomething()代码如下:

function doSomething() {
    include(xyz.php);
    ....
}

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


4

手册

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

_once()变体也是如此。


4

PSR-0 / PSR-4自动加载器时代,如果您所需要做的只是使代码可以使用某些函数/类,则完全不需要使用任何语句(当然,如果您需要require_once在引导程序文件和include模板中自动加载自身)仍使用PHP作为模板引擎)。


3

 

  1. 什么时候应该使用requireinclude

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

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

    我个人的建议(对于不太重要的代码)是require在开发阶段的代码中随处使用该函数,以便您可以调试代码,以后再将所有require函数替换为include功能,然后再移入生产环境,以免丢失任何不会影响最终用户的错误,其余的代码将正确执行...

  2. 什么时候应该使用require_oncerequire

    之间的基本区别require,并require_oncerequire_once将检查文件是否已经包含或不如果已经包含它,那么它不会包括文件,而require功能将包括文件,不论文件是否已经包含与否。

    因此,在您想要一次又一次require地包含一些代码的情况下,请使用函数,而如果您只想一次在代码中包含一些代码,请使用require_once


2
  1. 需要加载任何类,函数或依赖项时,请使用require函数。

  2. 要加载模板样式的文件时,请使用包含功能

如果仍然感到困惑,请一直使用require_once


1

它们都是包括文件的所有方式。

需求意味着它需要它。Require_once表示将需要它,但只需要一次。包含意味着它将包含一个文件,但不需要继续。

例子:

Require 'filename'
Require_once 'filename'
Include 'filename'

还有一个include_once函数,一次包含一个文件。

Include_once 'filename'

在手机上输入内容时,请不要在大写字母处使用。


1

我注意到的一件事,在使用包含时,我只能从包含它的文件中访问包含文件的功能。使用require_once,我可以在第二个require_once文件中运行该功能。

还:我建议添加

if(file_exists($RequiredFile)){
    require_once($RequiredFile);
}else{
  die('Error: File Does Not Exist');
}

因为当require_once杀死该页面时,它有时可以回显您网站文件的目录

这是我需要文件的自定义函数:

function addFile($file, $type = 'php', $important=false){
    //site-content is a directory where I store all the files that I plan to require_once
    //the site-content directory has "deny from all" in its .htaccess file to block direct connections
    if($type && file_exists('site-content/'.$file.'.'.$type) && !is_dir('site-content/'.$file.'.'.$type)){
        //!is_dir checks that the file is not a folder
        require_once('site-content/'.$file.'.'.$type);
        return 'site-content/'.$file.'.'.$type;
    }else if(!$type && file_exists('site-content/'.$file) && !is_dir('site-content/'.$file)){
        //if you set "$type=false" you can add the file type (.php, .ect) to the end of the "$file" (useful for requiring files named after changing vars)
        require_once('site-content/'.$file);
        return 'site-content/'.$file;
    }else if($important){
        //if you set $important to true, the function will kill the page (which also prevents accidentally echoing the main directory path of the server)
        die('Server Error: Files Missing');
        return false;
    }else{
        //the function returns false if the file does not exist, so you can check if your functions were successfully added
        return false;
    }
}

用法示例:

$success = addFile('functions/common');

if($success){
    commonFunction();
}else{
    fallbackFunction();
}

0

基本上,如果您需要错误的路径,PHP会引发致命错误并调用shutdown函数,但是当您包含错误的路径时,PHP会继续执行,但只会显示警告该文件不存在。

从英文单词require开始,PHP被告知页面或文件的执行取决于所需的文件。

根据我的经验,通常需要重要文件,例如配置文件,数据库类和其他重要实用程序。


0

通常是要有条件地加载客户端库,还是继续加载它,而不管是否要使用它。

这是具体的例子;详细说明pcj所说的内容。

假设您有一个配置文件,用于存储数据库用户名和密码(conf.php):

<?php
//my site configuration file

//For Database
$location='localhost';
$dbuser='yourname';
$userpw='yourpassword';
$database='nameofdatabase';
?>

以及具有使用数据库的静态函数的类:

<?php
class UsedInLoop {
    public static function databaseQuery(){
        require(/path/to/conf.php);                //require_once will not work here
        $db = new mysqli($location, $dbuser, $userpw, $database);
        //yada yada yada
    }
}
?>

并且该静态函数在另一个在循环内被迭代调用的函数内使用:

<?php
require_once('path/to/arbitraryObject.php');  //either will likely be OK at this level
$obj = new arbitraryObject();
foreach($array as $element){
    $obj->myFunction();
}
?>

您只能要求/包括一次课程。如果在循环的每次迭代中都需要/包含它,则会出现错误。但是,每次调用静态函数时,都必须包括conf文件。

<?php
class arbitraryObject {
    public function myFunction(){
        require_once(/path/to/UsedInLoop.php);   //This must be require_once. require() will not work
        UsedInLoop::databaseQuery();
    }
}
?>

当然,将其移出函数可以解决该问题:

<?php
require(/path/to/UsedInLoop.php);   //now require() is fine   
class arbitraryObject {
    public function myFunction(){
        UsedInLoop::databaseQuery();
    }
}
?>

除非您担心加载可能仅在特定条件下使用的类的开销,并且不想在没有使用时加载它的开销。


-1

require比拥有更大的开销include,因为它必须首先解析文件。更换requiresincludes经常是一个很好的优化技术。


2
我知道这是一个迟到的评论,但这实际上是不正确的。require不会比解析文件更多include_once这些函数的版本都有一些开销,但是就像其他人所说的那样,在大多数应用程序中它几乎可以忽略不计。
2014年

-2

只需使用require和include。

因为考虑如何使用include_once或require_once。那是在寻找保存包含的或必需的PHP文件的日志数据。因此,这比包含和要求慢。

if (!defined(php)) {
    include 'php';
    define(php, 1);
}

只是这样使用...

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.