需要,包括,require_once和include_once之间的区别?

在PHP中:

  • 什么时候应该使用require vs.include
  • 什么时候应该使用require_once vs.include_once
673703 次浏览

还有requireinclude_once

所以你的问题应该是…

  1. 什么时候应该使用require vs.include
  2. 什么时候应该使用require_once vs.require

1的答案是这里

除了处理错误的方式不同之外,需要()函数与包括()函数相同。如果发生错误,包括()函数会生成警告,但脚本将继续执行。需要()会生成致命错误,脚本将停止。

2的答案可以找到这里

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

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

需要和包含的区别:如果找不到所需的文件,PHP将发出致命错误,而对于包括只会发出警告。

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

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

include仅在失败时生成E_WARNING错误,这或多或少是无声的。

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


对于*_once()

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

当然,这也适用于require_once()


参考:#0#1

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

使用

  • 要求
    当您的应用程序的文件为选填/必填时,例如重要的消息模板或包含配置变量的文件,如果没有这些变量,应用程序将中断。

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

  • 包括当不需要文件并且未找到时应用程序流应继续时,例如
    非常适合模板引用当前范围或其他变量

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

但基本上,这取决于你什么时候使用哪个。

我的建议是只使用require_once 99.9%的时间。

相反,使用requireinclude意味着您的代码不能在其他地方重用,即您拉进来的脚本实际上是执行代码,而不是使可用成为类或某些函数库。

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

如果你已经在做面向对象或函数式编程,使用include_once通常是推迟,在堆栈中你会发现错误/错误。你想知道函数do_cool_stuff()在你稍后去调用它时不可用,还是通过要求库来知道在你希望它可用的那一刻?通常,最好立即知道你需要和期望的东西是否不可用,所以只需使用require_once

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

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

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

对可重用的php模板使用“包含”。对所需的库使用“要求”。

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

手册

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

_once()变体也是如此。

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

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

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

查看以下留档页面:

包括/要求您可以多次包含相同的文件:

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

require_once/include_once

与包含/要求相同,除了PHP会检查文件是否已经包含,如果是,则不再包含(要求)它。

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

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

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

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

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

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

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

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

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

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

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

当您观看m需要test1文件两次但该文件将包含test1一次并在第二次调用时,这将被忽略。并且没有停止将显示一次输出。

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

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

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

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

当您正在观看包含test3文件的m时,将一次包含该文件,但停止进一步执行。

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

  1. 当您需要加载任何类、函数或依赖项时,请使用<景点>要求函数。

  2. 当您想加载模板样式的文件时,使用包括函数

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

  1. 什么时候应该使用requireinclude

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

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

    我个人的建议(对于不太重要的代码)是在开发阶段的代码中到处使用require函数,这样你就可以调试代码,然后在将其移动到生产之前将所有require函数替换为include函数,这样如果你错过了任何错误,它就不会影响最终用户,其余的代码也会正常执行…

  2. 什么时候应该使用require_oncerequire

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

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

只需使用需要和包含。

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

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

就这样用…

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

我使用的函数如下:

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

xyz.php.中声明了常量值

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

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

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

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

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

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

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

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

2018年7年后的答案

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

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

 <?php// arry.phpreturn ['x'=>'y'];
<?php//main.php$arr= require 'arry.php'

如果你打算包含的文件包含一些可执行的东西或声明了一些变量,你几乎总是需要使用require,因为如果你使用require_once,除了第一个地方,你的代码将不会被执行和/或你的变量不会静默启动,导致绝对难以确定的错误。

includeinclude_once实际上没有实际的用例。

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

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

示例:

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

还有一个include_once函数,其中包括一次文件。

Include_once 'filename'

不要在我用手机打字的地方使用大写字母。

我注意到的一件事是,当使用包含时,我只能从包含它的文件中访问包含的文件函数。使用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 connectionsif($type && file_exists('site-content/'.$file.'.'.$type) && !is_dir('site-content/'.$file.'.'.$type)){//!is_dir checks that the file is not a folderrequire_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 addedreturn false;}}

使用示例:

$success = addFile('functions/common');
if($success){commonFunction();}else{fallbackFunction();}

这通常是一个问题,您是否想要有条件地加载客户端库,或者继续加载它,无论您是否要使用它。

这里有一个具体的例子;详细说明pcj所说的话。

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

<?php//my site configuration file
//For Database$location='localhost';$dbuser='yourname';$userpw='yourpassword';$database='nameofdatabase';?>

还有一个具有使用数据库的静态函数的类:

<?phpclass 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}}?>

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

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

你只能要求/包含该类一次。如果你在循环的每次迭代中都要求/包含它,你会得到一个错误。但是,每次调用静态函数时,你都必须包含你的conf文件。

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

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

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

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

1-如果文件不存在,则“需要”和“require_once”会引发致命错误存在并停止脚本执行

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

3-“require_once”和“include_once”,正如他们的名字所暗示的。如果文件已经包含在其中,他们将不包含该文件“需要”、“require_once”、“包含”或“include_once”

require在找不到文件时停止下一行执行生成致命错误。

include生成警告,但在找不到文件时没有停止下一行执行。

require_once执行与require相同的操作,但它会检查文件是否已加载或未执行。

include_once执行与include相同的操作,但它会检查文件是否已加载或未执行。

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