在PHP中。
require
和 include
?require_once
与 include_once
?也有require
和include_once
。
所以你的问题应该是...
1.什么时候我应该使用require
与include
?
2.什么时候应该使用 require_once
与 require
?
1的答案在[这里]描述(http://www.w3schools.com/php/php_includes.asp)。
require()函数与include()相同,只是它处理错误的方式不同。如果发生错误,include()函数会产生一个警告,但脚本会继续执行。require()会产生一个致命的错误,脚本将停止执行。
2的答案可以在[这里](http://php.net/manual/en/function.require-once.php)找到。
require_once()语句与require()相同,只是PHP会检查文件是否已经被包含,如果是,则不再包含(require)它。
使用
require 当你的应用程序*需要该文件时,如 一个重要的消息模板或一个包含配置变量的文件,如果没有这个文件,应用程序就会崩溃。
[require_once][2]
当文件中包含的内容在随后的收录中会产生错误时,例如: function important() { /*重要的代码 */}
在你的应用程序中肯定需要,但由于不能重新声明函数,所以不应再次收录。
function important() { /* important code */}
在你的应用程序中肯定需要,但由于函数不能重新声明,所以不应该再被包含。
[include][3] 当不需要该文件,且未找到该文件时,应用程序流应该继续,例如 非常适用于模板引用当前作用域的变量或其他东西。
[include_once][4] 可选的依赖关系,这些依赖关系会在后续加载时产生错误,或者由于HTTP开销,你不希望远程文件包含两次。
但基本上,什么时候用哪个,就看你自己了。
1:
[2]: http://php.net/manual/en/function.require-once.php [3]: http://php.net/manual/en/function.include.php [4]: http://php.net/manual/en/function.include-once.php
我的建议是在99.9%的时间内使用 "require_once"。
使用 "require "或 "include "意味着你的代码在其他地方是不可重用的,即 你拉进来的脚本实际上是执行的代码,而不是让个类或一些函数库变得可用。
如果你需要/包含当场执行的代码,那'就是程序化代码,你需要了解一种新的范式。 比如面向对象编程,基于函数的编程,或者函数式编程。
如果你'已经在做OO或函数式编程,使用include_once
主要是要延你在堆栈中哪里发现bug/错误。
你想知道do_cool_stuff()
这个函数在你以后去调用它的时候,或者你期望它能被的时刻,通过要求库来实现吗?
一般来说,如果你需要和期望的东西不可用,最好马上知道,所以就用require_once
。
或者,在现代OOP中,只要在使用时[自动加载][1]你的类。
include()
会在不能包含文件时抛出警告,但脚本的其他部分会运行。
require()
将抛出一个E_COMPILE_ERROR
并在不能包含文件时停止脚本。
include_once()
和require_once()
函数不会在文件已经被包含的情况下再次包含它。
请参考以下文档页面。
[1]: http://php.net/manual/en/function.include.php [2]: http://www.php.net/manual/en/function.require.php [3]: http://www.php.net/manual/en/function.include-once.php [4]: http://www.php.net/manual/en/function.require-once.php
每当你使用require_once()
时,当你在当前文件中只需要一个被调用的文件时,可以在文件中使用require_once()
来包含另一个文件。
在这个例子中,我有一个test1.php。
<?php
echo "today is:".date("Y-m-d");
?>
而在另一个文件中,我把它命名为test2.php
<?php
require_once('test1.php');
require_once('test1.php');
?>
正如你所看到的m需要两次测试1文件,但该文件将包含一次测试1,第二次调用时,这将被忽略。 而在不停止的情况下,将只显示一次输出。
每当你在当前文件中需要被调用的文件时,可以在文件中使用'include_once()`来包含另一个文件。 在这个例子中,我有一个名为test3.php的文件。
<?php
echo "today is:".date("Y-m-d");
?>
在另一个文件中,我把它命名为test4.php。
<?php
include_once('test3.php');
include_once('test3.php');
?>
当你在看m文件时,包括test3文件将只包含一个文件,但停止进一步的执行。
这个问题是七年前提出来的,没有一个答案为这个问题提供实际帮助。
在现代的PHP编程中,你主要是使用required_once
只包含一次你的自动加载器类(composer自动加载器经常使用),它会加载你所有的类和函数(函数文件需要显式添加到composer.json
文件中,才能在所有其他文件中使用)。
如果由于任何原因你的类不能从自动加载器中加载,你可以使用require_once
来加载它。
在某些情况下,我们需要使用require
。
例如,如果你有一个非常大的数组定义,而你又不想把它添加到你的类定义源代码中,你可以。
<?php
// arr.php
return ['x'=>'y'];
<?php
//main.php
$arr= require 'arry.php'
如果你打算包含的文件包含一些可执行的东西或声明一些变量,你几乎总是需要使用 "require",因为如果你除了在第一个地方使用 "require_once",你的代码将不会被执行和/或你的变量不会默默地启动,导致绝对难以确定的错误。
include
和include_once
真的没有实际的用处。
区别在于这些命令产生的错误。使用 "require",你想使用的文件确实是需要的,因此如果没有找到,会产生一个 "E_ERROR"。
require()
与include()
相同,只是在失败时也会产生一个致命的E_ERROR
级错误。
include
在失败时只产生一个E_WARNING
错误,这或多或少是沉默的。
因此,如果该文件是使其余代码工作所必需的,而你希望脚本在该文件不可用的情况下失败的话,就使用它。
对于 *_once()
:
include_once()
可以用于在一个脚本的特定执行过程中,同一个文件可能被多次包含和评估的情况,所以在这种情况下,它可以帮助避免诸如函数重新定义、变量值重新赋值等问题。
当然,这也适用于 require_once()
。
你应该把类和函数定义组织在文件中。
使用require_once()
来加载依赖(类、函数、常量)。
使用require()
来加载模板类文件。
使用include_once()
来加载选择的依赖(类、函数、常量)。
使用include()
加载可选的类似模板的文件。
[Include][1] / [Require][3] 你也可以多次包含同一个文件。
require()和include()是一样的,除了在失败时它会产生一个致命的E_COMPILE_ERROR级别的错误。 换句话说,它会停止脚本,而include()只会发出一个警告(E_WARNING),允许脚本继续。
[require_once][2] / [include_once][4] 。 >.是和include/require一样的。 与include/require相同,除了PHP会检查文件是否已经被包含,如果已经被包含,就不会再包含(require)它。
[1]: http://php.net/include [2]: http://php.net/require_once [3]: http://php.net/require [4]: http://php.net/include_once
从[手册][1]。
>. "require() "与 "include() "相同。
require()
和include()
是一样的,只是一旦失败,它也会产生一个致命的E_COMPILE_ERROR
级错误。
换句话说,它将停止脚本,而include()
只发出一个警告(E_WARNING
),允许脚本继续。
_once()
变体也是如此。
我使用的函数如下。
function doSomething() {
require_once(xyz.php);
....
}
在xyz.php中声明了一些常量值,我必须从另一个PHP脚本文件中调用这个doSomething()函数。
我必须从另一个PHP脚本文件中调用doSomething()函数。
但是我观察到在循环中调用这个函数时的行为,第一次迭代doSomething()可以得到xyz.php
中的常量值,但是后来每次迭代doSomething()
都不能得到xyz.php
中声明的常量值。
我把require_once()
改成了include()
,更新后的doSomething()
代码如下。
function doSomething() {
include(xyz.php);
....
}
现在每一次迭代调用doSomething()
都会得到xyz.php
中定义的常量值。
&amp;nbsp。
require
和include
函数的任务是一样的,即
包含并评估指定的文件,但不同的是require
会在指定的文件位置无效或任何错误时引起致命错误,而include
会产生警告并继续执行代码。
因此,当你试图包含的文件是系统的**核心,可能会对其他代码造成巨大影响时,你可以使用require
函数,而当你试图包含的文件是一个简单的文件,包含一些不太重要的代码时,你可以使用include
函数。
而我个人的建议(对于不那么重要的代码)是,在你的代码处于开发阶段的时候,在所有的地方都使用require
函数,这样你就可以调试代码,之后在将代码转移到生产阶段之前,用include
函数替换所有的require
函数,这样,如果你错过了任何错误,也不会影响最终用户,而且代码的其他部分也能正常执行......。
require_once
还是require
?require
和require_once
的基本区别是require_once
会检查文件是否已经被包含,如果已经被包含了,那么就不会包含文件,而require
函数会不管文件是否已经被包含,都会包含文件。
因此,如果你想一次又一次地包含一些代码,就使用require
函数,而如果你只想在你的代码中包含一些代码,就使用require_once
。
我注意到一件事,当使用include时,我只能从包含该文件的文件中访问该文件的函数,而使用require_once,我可以在第二个require_once文件中运行该函数。 使用 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();
}