在PHP中:

什么时候应该使用require和include? 什么时候应该使用require_once vs. include_once?


当前回答

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

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

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

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

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

其他回答

对于可重用的PHP模板,使用“include”。使用“require”表示必需的库。

“*_once”很好,因为它检查文件是否已经加载,但它只在“require_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()来确保所需的文件被包含并且不会丢失。

区别在于命令生成的错误。使用require,您想要使用的文件确实是必需的,因此如果找不到它,将生成一个E_ERROR。

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

include只在失败时生成一个E_WARNING错误,该错误或多或少是沉默的。

因此,如果需要该文件才能使其余代码正常工作,并且您希望脚本失败,则使用该文件。


* _once ():

Include_once()可以在脚本的特定执行过程中多次包含和计算相同文件的情况下使用,因此在这种情况下,它可以帮助避免诸如函数重新定义、变量值重新赋值等问题。

当然,同样适用于require_once()。


引用:require(), include_once()

1 -如果文件不是,"require"和"require_once"会抛出致命错误 存在并停止脚本执行

2 - "include"和"include_once"抛出警告并执行 仍在继续

3 - "require_once"和"include_once",顾名思义, 如果文件已经包含,则将不包含该文件 "require", "require_once", "include"或"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();
    }
}
?>

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