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

时间:2010-03-10 16:13:25

标签: php include require require-once

在PHP中:

  • 我应该何时使用requireinclude
  • 我应该何时使用require_onceinclude_once

26 个答案:

答案 0 :(得分:1310)

还有requireinclude_once

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

  1. 我应该何时使用requireinclude
  2. 我应该何时使用require_oncerequire
  3. {1}的答案被描述为here

      

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

    可以找到2的答案here

      

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

答案 1 :(得分:368)

使用

  • require
    当您的应用程序文件 required 时,例如一个重要的消息模板或包含配置变量的文件,应用程序不会破坏它们。

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

  • include 当不需要文件时,应用程序流程应在未找到时继续,例如
    适用于引用当前范围内的变量的模板

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

但基本上,由你决定何时使用它。

答案 2 :(得分:284)

我的建议是在99.9%的时间内使用require_once

使用requireinclude代表您的代码无法在其他地方重复使用,即您提取的脚本实际上是执行代码而不是可用一个类或一些函数库。

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

如果您已经在进行面向对象或函数式编程,那么使用include_once主要是延迟在堆栈中您会发现错误/错误。您是否想知道当您稍后致电时,do_cool_stuff()功能不可用,或者您希望它可用的那一刻 需要该库?一般来说,最好立即知道您需要和期望的内容是否不可用,所以只需使用require_once

或者,在现代OOP中,只需使用autoload课程。

答案 3 :(得分:33)

_once函数与没有_once函数之间的区别: 没有_once代码将被包含在内,而使用_once函数,PHP会跟踪包含的文件,并且只包含一次。

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

答案 4 :(得分:28)

如果

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

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

include_once()require_once()函数如果已包含该文件,则不会再次包含该文件。

请参阅以下文档页面:

答案 5 :(得分:21)

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

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

并在另一个名为test2.php

的文件中
<?php  
require_once('test1.php');  
require_once('test1.php');  
?>

当你正在观看需要test1文件两次的m时,文件将包含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将包含文件一次但停止进一步执行。

答案 6 :(得分:18)

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

“* _ once”很好,因为它会检查文件是否已经加载,但它只对我有用“require_once”。

答案 7 :(得分:15)

区别在于命令生成的错误。对于require,您确实需要使用的文件,因此如果找不到,则会生成E_ERROR

  

require()include()相同,但失败后也会产生致命E_ERROR级错误。

include只会在失败时产生E_WARNING错误,而这个错误或多或少是无声的。

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


*_once()

  

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

同样适用于require_once()


参考:require()include_once()

答案 8 :(得分:14)

2018年7年后的答案

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

这些天你只使用require来分割一大块PHP文件。这主要是一个大数组定义。在这种情况下,您只能使用require而不是require_once

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

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

如果您打算使用的文件包含可执行文件或声明某些变量,那么几乎所有时间都需要使用require,因为如果您在其他地方使用require_once,您的代码将无法执行, /或你的变量不会默默地启动,导致绝对难以查明的错误。

includeinclude_once确实没有实际用例。

答案 9 :(得分:11)

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

使用require_once()加载 依赖项 (类,函数,常量)。

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

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

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

答案 10 :(得分:9)

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

答案 11 :(得分:8)

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

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

答案 12 :(得分:7)

Include / Require您也可以多次包含同一个文件:

  

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

require_once / include_once

  

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

答案 13 :(得分:5)

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

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

答案 14 :(得分:4)

来自manual

  

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

_once()变体也是如此。

答案 15 :(得分:4)

我使用的功能如下:

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中定义的常量值。

答案 16 :(得分:4)

PSR-0 / PSR-4自动加载器的时代,如果你只需要为你的代码提供一些函数/类,那么使用任何语句可能完全没必要(当然,你还需要{{如果您仍然使用PHP作为模板引擎,则自动加载器本身位于引导文件和require_once模板中。

答案 17 :(得分:3)

  1. 何时应该使用requireinclude

    requireinclude函数执行相同的任务,即包含和评估指定的文件,但当指定的文件位置无效时,差异为require将导致致命错误或者对于任何错误,include将生成警告并继续执行代码。

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

    我的个人建议(对于不那么重要的代码)是在代码处于开发阶段的任何地方使用require函数,以便您可以调试代码,然后替换所有require在将include函数移动到生产之前按{1}}函数运行,这样如果你错过任何错误,它将不会影响最终用户并且其余代码正确执行...

  2. 何时应该使用require_oncerequire

    requirerequire_once之间的基本区别是require_once将检查文件是否已经包含(如果已包含),那么它将不包含该文件,而require {1}}函数将包含文件,而不管文件是否已包含在内。

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

答案 18 :(得分:2)

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

  2. 如果要加载模板样式文件,请使用 include 功能

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

答案 19 :(得分:1)

它们都是包含文件的方式。

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

示例:

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

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

Include_once 'filename'

当我在手机上打字时,请不要使用大写字母。

答案 20 :(得分:0)

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

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

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

答案 21 :(得分:0)

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

还:我建议添加

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

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

答案 22 :(得分: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();
    }
}
?>

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

答案 23 :(得分:0)

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

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

3 - 顾名思义,“require_once”和“include_once”, 如果文件已经包含在 “require”、“require_once”、“include”或“include_once”

答案 24 :(得分:-1)

require的开销大于include,因为它必须先解析文件。用requires替换includes通常是一种很好的优化技术。

答案 25 :(得分:-2)

只需使用require和include。

因为想想如何使用include_once或require_once。 那就是寻找保存包含或需要的PHP文件的日志数据。 所以这比include和require慢。

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

就这样使用......