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

问题描述 投票:1118回答:24

在PHP中:

  • 我什么时候应该使用requireinclude
  • 我什么时候应该使用require_onceinclude_once
php include require require-once
24个回答
1329
投票

还有requireinclude_once

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

  1. 我什么时候应该使用requireinclude
  2. 我什么时候应该使用require_oncerequire

here描述了1的答案。

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

2的答案可以找到here

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


12
投票

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

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

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

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

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


9
投票

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


8
投票

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

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


7
投票

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

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

require_once / include_once

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


5
投票

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

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


4
投票

来自manual

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

_once()变体也是如此。


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


4
投票

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


3
投票

  1. 什么时候应该使用requireincluderequireinclude函数执行相同的任务,即包含和评估指定的文件,但差异是require将在指定的文件位置无效或任何错误时导致致命错误,而include将生成警告并继续执行代码。 因此,如果您尝试包含的文件是系统的核心,可能会使用require函数,并且可能会对代码的其余部分造成巨大影响,并且当您尝试包含的文件时可以使用include函数是一个包含一些不太重要的代码的简单文件。 我的个人建议(对于不太重要的代码)是在代码中的任何地方使用require函数,当它处于开发阶段时,您可以调试代码,然后在将require函数移动到生产之前用include函数替换所有require_once函数,如果您错过了任何错误,它将不会影响最终用户,其余代码正确执行...
  2. 什么时候应该使用requirerequirerequire_oncerequire_once之间的基本区别是require将检查文件是否已经包含(如果已经包含),那么它将不包括该文件,而require函数将包括该文件,而不管文件是否已被包含。 因此,如果您想要一次又一次地包含一些代码,请使用require_once函数,而如果您只想在代码中包含一些代码,请使用Require 'filename' Require_once 'filename' Include 'filename'

2
投票
  1. 需要加载任何类,函数或依赖项时,请使用require函数。
  2. 如果要加载模板样式文件,请使用include函数

如果你仍然感到困惑,那就一直使用require_once。


379
投票

使用

  • require 当您的申请需要该文件时,例如一个重要的消息模板或包含配置变量的文件,应用程序不会破坏它们。
  • require_once 当文件包含在后续包含时会产生错误的内容,例如function important() { /* important code */}在您的应用程序中绝对需要,但由于功能无法重新声明,因此不应再次包含。
  • include当不需要文件时,应用程序流程应在未找到时继续,例如 非常适用于引用当前范围或其他内容的变量的模板
  • include_once 可选的依赖项会在后续加载时产生错误,或者由于HTTP开销而不希望发生两次远程文件包含

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


1
投票

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

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

例子:

Include_once 'filename'

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

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

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


1
投票

有一点我注意到,当使用include时,我只能从包含它的文件中访问包含的文件函数。使用require_once,我可以在第二个required_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;
    }
}

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

这是我要求文件的自定义功能:

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

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

用法示例:

require

0
投票

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

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

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


-1
投票

includerequires有更大的开销,因为它必须首先解析文件。用includes替换if (!defined(php)) { include 'php'; define(php, 1); } 通常是一种很好的优化技术。


-2
投票

只需使用require和include。

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

qazxswpoi

就这样用......


289
投票

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

使用requireinclude代替意味着您的代码不能在其他地方重复使用,即您提取的脚本实际上执行代码而不是提供类或某些函数库。

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

如果您已经在进行面向对象或函数式编程,那么使用include_once主要是在延迟堆栈中发现错误/错误的位置。你是否想知道当你以后去打电话时,或者你希望通过要求图书馆可以获得它的时刻,do_cool_stuff()功能不可用?一般来说,最好立即知道您需要和期望的东西是否不可用,所以只需使用require_once

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


33
投票

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

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


28
投票

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

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

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

请参阅以下文档页面:


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将包含文件一次但停止进一步执行。


18
投票

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

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


15
投票

不同之处在于命令生成的错误。使用require,您想要使用的文件确实是必需的,因此如果找不到它会生成E_ERROR

require()include()相同,除非失败,它也会产生致命的E_ERROR级错误。

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

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


对于*_once()

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

同样适用于require_once()当然。


参考:require()include_once()


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确实没有实际用例。

© www.soinside.com 2019 - 2024. All rights reserved.