在PHP中:
- 我什么时候应该使用
require
vs.include
- 我什么时候应该使用
require_once
vs.include_once
在PHP中:
require
vs.include
require_once
vs.include_once
Answers:
也有require
和include_once
。
所以你的问题应该是...
require
vs.include
require_once
vs.require
这里描述1的答案。
require()函数与include()相同,不同之处在于它对错误的处理方式不同。如果发生错误,include()函数将生成警告,但脚本将继续执行。require()产生致命错误,脚本将停止。
在这里可以找到2的答案。
require_once()语句与require()相同,除了PHP会检查文件是否已被包含,如果不包含,将不再对其进行包含(require)。
require_once()
则将是两者中比较快的文件
采用
需要
时,该文件要求您的应用程序,例如,一个重要的信息模板或没有这些应用程序将打破一个包含文件中的配置变量。
当文件包含的内容在随后的包含时会产生错误的内容时,例如function important() { /* important code */}
,在您的应用程序中绝对需要,但由于不能重新声明函数,则不再需要包含
require_once。
在不需要文件时包括在内,并且在找不到文件时应继续使用应用程序流,例如,
对于引用当前作用域或其他内容的模板非常有用
include_once
可选的依赖项,会在后续加载或远程文件包含时产生错误,由于HTTP开销,您不希望发生两次
但基本上,什么时候使用取决于您。
include
?include_once
?require
?require_once
?
我的建议是仅使用require_once
99.9%的时间。
使用require
或include
表示您的代码不可在其他地方重用,即,您要拉入的脚本实际上是在执行代码,而不是提供类或某些函数库。
如果您需要/包括当场执行的代码,那么这就是程序代码,并且您需要了解新的范例。类似于面向对象的编程,基于函数的编程或函数式编程。
如果您已经在进行面向对象的编程或函数式编程,则使用include_once
它通常会延迟在堆栈中发现错误/错误的位置。您是否想知道该函数do_cool_stuff()
在以后去调用时是不可用的,还是在您要求通过使用库来使它可用的那一刻不可用?通常,最好立即知道您需要和期望的东西是否不可用,因此请使用require_once
。
另外,在现代OOP中,只需在使用时自动加载您的类即可。
include
家族通常是一个绝妙的主意(因为很少包含可能不存在的文件),而在require_once
和中require
,require_once
当包含定义函数或类的文件时应使用在其他地方使用,或实例化数据库连接对象之类的单例,并require
用于包含文件,这些文件在被包含时立即起作用。在任何大型Web应用程序中,后一种包含都是不常见的。
require_once
是几乎所有时间都在使用它。由于选择之间的开销差异很小,require
可确保脚本停止运行,因此我无法想到许多情况下应用程序可以在不包含文件的情况下生存下来的情况。并_once
保护免受欺骗问题。任何不同意的人都可能知道自己在做什么,可以选择适合该应用程序或方案的任何一种。
include()
如果无法包含该文件,则会发出警告,但脚本的其余部分将运行。
require()
E_COMPILE_ERROR
如果无法包含该文件,则会抛出一个脚本并停止该脚本。
该include_once()
和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两次需要test1文件时,但是该文件将一次包含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会一次包含该文件,但会停止进一步执行。
您应该将类和函数定义组织在文件中。
使用require_once()
负载依赖性(类,函数,常量)。
使用require()
负载类似模板文件。
使用include_once()
加载可选依赖(类,函数,常量)。
使用include()
加载可选的类似模板文件。
这个问题是七年前提出的,没有一个答案可以为问题提供实际的帮助。在现代的PHP编程中,您主要required_once
只使用一次包含您的autoloader类(通常是composer autoloader),并且它将加载您的所有类和函数(功能文件需要显式添加到composer.json
文件中才能在所有其他文件中使用)。如果由于某种原因无法从自动加载器加载您的类,则可以使用require_once
它来加载它。
在某些情况下,我们需要使用require
。例如,如果您有很大的数组定义,并且不想将其添加到类定义源代码中,则可以:
<?php
// arr.php
return ['x'=>'y'];
<?php
//main.php
$arr= require 'arry.php'
如果要包含的文件包含可执行文件或声明了一些变量,则几乎总是需要使用require
,因为如果您require_once
与第一个地方分开使用,则代码将不会被执行和/或变量不会以静默方式启动,从而导致错误很难确定。
没有实际的使用情况include
和include_once
真。
include()
在输出缓冲区中使用,来实现模板引擎。
require()
过拆分大文件的功能。
require_once
在函数内部使用PHPMailer 时,我遇到了同样的问题,而我的自动加载器$mail
在代码的后面定义了所需的变量,因此下一个require_once
将被忽略,而这个变量$mail
尚未初始化!解决方案是require
在函数调用后简单使用。
require
在这些情况下,您是否有任何不使用的理由?
区别在于命令生成的错误。使用时require
,实际上需要使用要使用的文件,E_ERROR
如果找不到该文件,则会生成一个。
require()
等同include()
于失败,也会产生致命的E_ERROR
错误。
include
仅E_WARNING
在失败时产生错误,该错误或多或少是无声的。
因此,如果需要使用文件才能使其余代码正常工作,并且您希望脚本失败,请使用该文件不可用。
对于*_once()
:
include_once()
在脚本的特定执行过程中可能多次包含和评估同一文件的情况下,可以使用,因此在这种情况下,它可以帮助避免诸如函数重新定义,变量值重新分配等问题。
require_once()
当然,这同样适用。
require
给出E_COMPILE_ERROR,而不是E_ERROR。
require()与include()相同,除了失败时还会产生致命的E_COMPILE_ERROR级错误。换句话说,它将停止脚本,而include()仅发出警告(E_WARNING),该警告允许脚本继续运行。
与include / require相同,不同之处在于PHP将检查文件是否已被包含,如果不包含,将不再对其进行包含(要求)。
我正在使用如下功能:
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
。
什么时候应该使用require
或include
?
该require
和include
功能执行相同任务,即包括并运行指定文件,但不同的是require
会造成致命的错误时,指定的文件位置是无效或对任何错误,而include
会产生警告,并继续执行代码。
因此require
,如果您要包含的文件是系统的核心,并且可能对其余代码产生巨大影响,则可以使用该函数,并且可以使用include
函数;当您要包含的文件是一个文件时,函数。包含一些不太重要的代码的简单文件。
我个人的建议(对于不太重要的代码)是require
在开发阶段的代码中随处使用该函数,以便您可以调试代码,以后再将所有require
函数替换为include
功能,然后再移入生产环境,以免丢失任何不会影响最终用户的错误,其余的代码将正确执行...
什么时候应该使用require_once
或require
?
之间的基本区别require
,并require_once
为require_once
将检查文件是否已经包含或不如果已经包含它,那么它不会包括文件,而require
功能将包括文件,不论文件是否已经包含与否。
因此,在您想要一次又一次require
地包含一些代码的情况下,请使用函数,而如果您只想一次在代码中包含一些代码,请使用require_once
。
它们都是包括文件的所有方式。
需求意味着它需要它。Require_once表示将需要它,但只需要一次。包含意味着它将包含一个文件,但不需要继续。
例子:
Require 'filename'
Require_once 'filename'
Include 'filename'
还有一个include_once函数,一次包含一个文件。
Include_once 'filename'
在手机上输入内容时,请不要在大写字母处使用。
我注意到的一件事,在使用包含时,我只能从包含它的文件中访问包含文件的功能。使用require_once,我可以在第二个require_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();
}
通常是要有条件地加载客户端库,还是继续加载它,而不管是否要使用它。
这是具体的例子;详细说明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();
}
}
?>
除非您担心加载可能仅在特定条件下使用的类的开销,并且不想在没有使用时加载它的开销。