【发布时间】:2011-01-25 23:37:00
【问题描述】:
在 PHP 中:
- 什么时候应该使用
require和include? - 什么时候应该使用
require_once和include_once?
【问题讨论】:
-
PHP CodeSniffer 说,如果有条件地包含文件,请使用 include_once(而不是 require_once)。
标签: php include require require-once
在 PHP 中:
require 和include?require_once 和include_once?【问题讨论】:
标签: php include require require-once
【讨论】:
_once 函数和没有 _once 函数的区别: 没有 _once 的代码将被再次包含,而带有 _once 函数的 PHP 会跟踪包含的文件,并且只会包含一次。
require 和 include 的区别: 如果找不到所需的文件,PHP 将发出致命错误,而对于 include 只会发出警告。
【讨论】:
不同之处在于命令生成的错误。使用require,您要使用的文件确实是必需的,因此如果找不到它会生成E_ERROR。
require()与include()相同,但失败时也会产生致命的E_ERROR级别错误。
include 仅在失败时才会生成 E_WARNING 错误,这或多或少是无声的。
因此,如果需要该文件以使其余代码工作并且您希望脚本失败,则使用它,该文件不可用。
对于*_once():
include_once()可用于在特定脚本执行期间可能多次包含和评估同一文件的情况,因此在这种情况下,它可能有助于避免函数重新定义、变量值重新分配等问题.
同样适用于require_once()。
【讨论】:
要求文件必须存在,如果不存在则会显示错误;而使用 include - 如果文件不存在,则页面将继续加载。
【讨论】:
使用
require
当您的应用程序需要文件时,例如一个重要的消息模板或一个包含配置变量的文件,如果没有它们,应用程序就会中断。
require_once
当文件包含会在后续包含时产生错误的内容时,例如
function important() { /* important code */} 在您的应用程序中肯定是必需的,但由于无法重新声明函数,因此不应再次包含。
include
当不需要该文件时,应用程序流程应在未找到时继续,例如
非常适合从当前范围内引用变量的模板或其他东西
include_once
可选依赖项,这些依赖项会在后续加载时产生错误,或者可能会因为 HTTP 开销而导致您不希望发生两次的远程文件包含错误
但基本上,何时使用哪个取决于您。
【讨论】:
我的建议是在 99.9% 的时间里使用 require_once。
使用require 或include 意味着您的代码不能在其他地方重用,即您引入的脚本实际上是执行 代码而不是可用 一个类或一些函数库。
如果您需要/包含在现场执行的代码,那就是程序代码,您需要了解新的范例。像面向对象的编程、基于函数的编程或函数式编程。
如果您已经在进行 OO 或函数式编程,则使用 include_once 主要是延迟您在堆栈中发现错误/错误的位置。您想知道函数do_cool_stuff() 在您稍后调用它时不可用,或者您希望它可用的那一刻 需要库?一般来说,如果您需要和期望的东西不可用,最好立即知道,所以只需使用require_once。
或者,在现代 OOP 中,使用时只需 autoload 您的类。
【讨论】:
需要关键部分,例如授权并包括所有其他部分。
多重包含只是非常糟糕的设计,必须完全避免。所以,*_once 并不重要。
【讨论】:
对可重复使用的PHP 模板使用“包含”。对必需的库使用“require”。
“*_once”很好,因为它检查文件是否已经加载,但它只对我在“require_once”有意义。
【讨论】:
来自manual:
require()与include()相同,但在失败时它还会产生致命的E_COMPILE_ERROR级别错误。换句话说,它将停止脚本,而include()只发出一个警告 (E_WARNING) 允许脚本继续。
_once() 变体也是如此。
【讨论】:
include() 如果无法包含该文件,将抛出警告,但脚本的其余部分将运行。
require() 将抛出一个E_COMPILE_ERROR 并在脚本无法包含该文件时停止该脚本。
include_once() 和 require_once() 函数将不会再次包含该文件,如果它已经包含。
请参阅以下文档页面:
【讨论】:
include() 找不到文件时会产生警告,但require_once() 会产生致命错误。
另一件事是之前是否包含文件。那么require_once()就不会再包含了。
【讨论】:
您应该将类和函数定义组织在文件中。
使用require_once() 加载依赖项(类、函数、常量)。
使用require() 加载类似模板的文件。
使用include_once() 加载可选依赖项(类、函数、常量)。
使用include() 加载可选的类似模板的文件。
【讨论】:
只要您使用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 时,将包含该文件一次,但会停止进一步的执行。
【讨论】:
require 的开销大于include,因为它必须首先解析文件。将requires 替换为includes 通常是一种很好的优化技术。
【讨论】:
require 不会比 include 更多地解析文件。这些函数的_once 版本每个都有一点开销,但就像其他人所说的那样,在大多数应用程序中它几乎可以忽略不计。
当您需要加载任何类、函数或依赖项时,请使用 require 函数。
当你想加载模板样式的文件时使用include函数
如果您仍然感到困惑,请始终使用 require_once。
【讨论】:
什么时候应该使用require 或include?
require 和 include 函数执行相同的任务,即包含并评估指定的文件,但不同的是,require 在指定的文件位置无效或任何错误时会导致致命错误,而 @ 987654326@ 将产生警告并继续执行代码。
因此,如果您尝试包含的文件是系统的核心,您可以使用require 函数,并且可能会对其余代码产生巨大影响,您可以当您尝试包含的文件是包含一些不太重要的代码的简单文件时,请使用 include 函数。
我个人的建议(对于不太重要的代码)是在代码处于开发阶段时在代码中的任何地方使用require 函数,以便您可以调试代码,然后用@987654331 替换所有require 函数@ 函数,然后再将其移至生产环境,这样如果您遗漏任何错误,它不会影响最终用户,并且其余代码可以正常执行...
什么时候应该使用require_once 或require?
require 和 require_once 之间的基本区别是 require_once 将检查文件是否已包含,如果已包含则不包含该文件,而 require 函数将包含文件,无论文件是否已包含。
因此,如果您想一次又一次地包含一些代码,请使用require 函数,而如果您只想在代码中包含一些代码,请使用require_once。
【讨论】:
只需使用 require 和 include。
因为考虑如何使用 include_once 或 require_once。 那就是寻找保存包含或需要的 PHP 文件的日志数据。 所以这比 include 和 require 慢。
if (!defined(php)) {
include 'php';
define(php, 1);
}
就这样使用...
【讨论】:
在PSR-0 / PSR-4自动加载器的时代,如果您只需要使某些函数/类可用于您的代码(当然,您仍然需要require_once自动加载器),则可能完全不需要使用任何语句如果您仍然使用 PHP 作为模板引擎,则它本身在您的引导文件和 include 模板中)。
【讨论】:
我使用的函数如下:
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 中定义的常量值。
【讨论】:
基本上,如果你需要一个错误的路径,PHP会抛出一个致命错误并调用关闭函数,但是当你包含一个错误的路径时,PHP会继续执行,但它只会显示一个文件不存在的警告.
来自英文单词require,告诉PHP页面或文件的执行取决于所需的文件。
根据我的经验,需要配置文件、数据库类和其他重要实用程序等重要文件是正常的。
【讨论】:
这个问题是七年前提出的,没有一个答案能为这个问题提供实际帮助。在现代 PHP 编程中,您主要只使用一次 required_once 来包含您的自动加载器类(通常是作曲家自动加载器),它将加载您的所有类和函数(函数文件需要显式添加到 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 表示它需要它。 Require_once 表示它将需要它,但只需要它一次。包含意味着它将包含一个文件,但不需要它继续。
例子:
Require 'filename'
Require_once 'filename'
Include 'filename'
还有一个 include_once 函数,它包含一个文件一次。
Include_once 'filename'
不要在我用手机打字时使用大写字母。
【讨论】:
我注意到一件事,当使用 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();
}
【讨论】:
这通常取决于您是要有条件地加载客户端库,还是继续加载它而不管您是否要使用它。
这是一个具体的例子;详细说明 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();
}
}
?>
除非您担心加载可能仅在某些条件下使用并且不想在不使用时加载的类的开销。
【讨论】:
1 - 如果文件不是,“require”和“require_once”会抛出致命错误 存在并停止脚本执行
2 - "include" 和 "include_once" 抛出警告并执行 继续
3 - 顾名思义,“require_once”和“include_once”, 如果该文件已包含在其中,则它们将不包含该文件 “require”、“require_once”、“include”或“include_once”
【讨论】: