1361

在 PHP 中:

  • 我什么时候应该使用requirevs. include
  • 我什么时候应该使用require_oncevs. include_once
4

26 回答 26

1573

requireinclude_once也有。

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

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

此处描述了 1 的答案。

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

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

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

于 2010-03-10T16:17:52.327 回答
438

采用

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

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

  • 不需要文件时包含 ,找不到时应继续应用程序流程,例如
    非常适合从当前范围内引用变量的模板或其他东西

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

但基本上,何时使用哪个取决于您。

于 2010-03-10T16:25:59.543 回答
316

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

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

如果你需要/包含当场执行的代码,那就是程序代码,你需要了解一个新的范例。像面向对象的编程、基于函数的编程或函数式编程。

如果您已经在进行 OO 或函数式编程,那么使用include_once通常会延迟您在堆栈中发现错误/错误的位置。您是否想知道该函数do_cool_stuff()在您稍后调用它时不可用,或者您希望它通过请求库而可用的那一刻?通常,如果您需要和期望的东西不可用,最好立即知道,所以只需使用require_once.

或者,在现代 OOP 中,只需在使用时自动加载您的类。

于 2010-03-10T16:46:47.930 回答
42

_once 函数和不带 _once 函数的区别:不带 _once 的代码将被再次包含,而带 _once 函数的 PHP 会跟踪包含的文件并且只会包含一次。

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

于 2010-03-10T16:18:14.740 回答
37

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

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

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

请参阅以下文档页面:

于 2011-11-03T11:48:14.713 回答
27

2018年7年后的答案

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

有一些场合我们需要使用require. 例如,如果您有一个非常大的数组定义并且您不想将其添加到您的类定义源代码中,您可以:

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

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

如果您打算包含的文件包含可执行文件或声明了一些您​​几乎总是需要使用的变量require,因为如果您require_once在第一次使用之外使用,您的代码将不会被执行和/或您的变量不会静默启动,从而导致错误绝对难以确定。

真的没有实际用例includeinclude_once

于 2017-11-11T00:00:05.343 回答
26

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

用于require_once()加载依赖项(类、函数、常量)。

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

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

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

于 2012-06-02T09:20:26.823 回答
26

每当您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 时,将包含该文件一次,但会停止进一步执行。

于 2012-09-29T09:42:35.263 回答
21

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

"*_once" 很好,因为它检查文件是否已经加载,但它只对我在 "require_once" 中有意义。

于 2010-03-10T17:08:38.950 回答
16

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

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

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

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


对于*_once()

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

当然同样适用require_once()


参考:require(),include_once()

于 2010-03-10T16:20:32.290 回答
10

 

  1. 什么时候应该使用requireor include

    require和函数执行相同的include任务,即包含并评估指定的文件,但不同的是,require当指定的文件位置无效或任何错误时会导致致命错误,而include会生成警告并继续执行代码。

    因此,您可以require在您尝试包含的文件是系统的核心并且可能对其余代码造成巨大影响的情况下使用该include函数,并且您可以在您尝试包含的文件是一个包含一些不太重要的代码的简单文件。

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

  2. 什么时候应该使用require_onceor require

    requirerequire_onceis之间的基本区别require_once将检查文件是否已包含,如果已包含,则不会包含该文件,而该require函数将包含该文件,而不管文件是否已包含。

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

于 2015-07-30T06:05:36.457 回答
9

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

于 2010-03-10T16:24:59.910 回答
8

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

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

于 2010-03-10T17:04:30.680 回答
7

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

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

require_once / include_once

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

于 2011-11-03T11:48:24.477 回答
7

我正在使用如下功能:

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.

于 2016-09-30T06:51:28.487 回答
5

手册

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

_once()变体也是如此。

于 2011-11-03T11:46:19.680 回答
5

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

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

于 2011-11-03T11:48:37.650 回答
5

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

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

3 - "require_once" and "include_once" as their names suggests , they will not include the file if the file was already included with "require", "require_once", "include" or "include_once"

于 2021-07-28T06:44:05.433 回答
4

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

于 2015-10-25T15:39:26.740 回答
2
  1. 当您需要加载任何类、函数或依赖项时,请使用require函数。

  2. 当你想加载模板样式的文件时使用包含函数

如果您仍然感到困惑,请始终使用require_once

于 2015-07-07T04:13:21.810 回答
1

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

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

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

于 2017-09-17T10:20:26.240 回答
1

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

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

例子:

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

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

Include_once 'filename'

不要在我用手机打字时使用大写字母。

于 2017-11-22T08:20:47.257 回答
1

我注意到的一件事是,在使用 include 时,我只能从包含它的文件中访问包含的文件功能。使用 require_once,我可以在第二个 required_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();
}
于 2019-04-10T20:23:05.823 回答
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();
    }
}
?>

除非您担心加载可能仅在某些条件下使用并且不想在不使用时加载它的类的开销。

于 2020-05-12T18:41:52.967 回答
-1

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

于 2012-11-14T19:52:54.010 回答
-2

只需使用 require 和 include。

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

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

就这样使用...

于 2015-08-06T08:44:14.430 回答