在PHP中:
什么时候应该使用require和include? 什么时候应该使用require_once vs. include_once?
在PHP中:
什么时候应该使用require和include? 什么时候应该使用require_once vs. include_once?
当前回答
1 -如果文件不是,"require"和"require_once"会抛出致命错误 存在并停止脚本执行
2 - "include"和"include_once"抛出警告并执行 仍在继续
3 - "require_once"和"include_once",顾名思义, 如果文件已经包含,则将不包含该文件 "require", "require_once", "include"或"include_once"
其他回答
在PHP中,有4个类似的函数用于包含和要求文件:
include(): include()语句用于将一个文件的内容包含到另一个文件中。如果无法找到包含的文件,将生成警告,但脚本将继续执行。
require(): require()语句类似于include,但是如果找不到文件,它会生成一个致命错误。脚本将立即停止执行。
include_once(): include_once()语句与include相同,但它只包含文件一次,即使在同一个脚本中包含多次。
require_once(): require_once()语句与require相同,但它只包含文件一次,即使它在同一个脚本中包含多次。
简单来说:
当您希望包含一个文件并在文件丢失的情况下继续执行脚本时,使用include()。
当您需要包含一个文件并在文件丢失时停止执行脚本时,请使用require()。
当您希望只包含一次文件时,请使用include_once()或require_once(),以避免出现重复函数或变量的问题。
注意:一般情况下,建议使用require_once()而不是include_once()来确保所需的文件被包含并且不会丢失。
这通常是一个问题,你是想有条件地加载一个客户端库,还是不管你是否要使用它都直接加载它。
这里有一个具体的例子;详述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();
}
}
?>
除非您担心加载一个可能只在某些条件下使用的类的开销,并且不想在不使用时加载它。
Require的开销比include大,因为它必须首先解析文件。用包含替换require通常是一种很好的优化技术。
我的建议是99.9%的情况下只使用require_once。
而使用require或include则意味着你的代码在其他地方是不可重用的,也就是说,你正在导入的脚本实际上是在执行代码,而不是提供一个类或一些函数库。
如果你需要/包含当场执行的代码,那就是过程代码,你需要了解一种新的范式。比如面向对象编程,基于函数的编程,或者函数式编程。
如果您已经在进行面向对象或函数式编程,那么使用include_once主要会延迟在堆栈中发现错误/错误的地方。您是否希望在稍后调用do_cool_stuff()函数时知道它不可用,或者在通过要求库而期望它可用的时候知道它不可用?通常,最好立即知道您需要和期望的东西是否不可用,因此只需使用require_once。
或者,在现代OOP中,只需在使用时自动加载你的类。
Include()如果不能包含该文件将抛出警告,但脚本的其余部分将运行。
require()将抛出一个E_COMPILE_ERROR并在脚本不能包含该文件时停止脚本。
如果文件已经被包含,include_once()和require_once()函数将不会第二次包含该文件。
请参见以下文档页面:
包括 需要 include_once require_once