PHP:require与include:实际注意事项


PHP: require versus include: practical considerations?

我读到include和require之间的区别之一是如果include语句为遇到,require将文件包含到托管require的文件中语句,即使执行流未到达require代码。

这怎么会有任何影响呢。毕竟,如果我有一个文件,上面写着:

<?php
  echo __LINE__;
?>

输出将始终为3,而不是在包含此类包含文件的文件内部的位置。

据我所知,这根本不是真的。如果代码中没有到达require行,则文件肯定不会包含在内。

关于require的PHP手册指出:

requireinclude相同,不同之处在于一旦发生故障,它也将产生严重的E_COMPILE_ERROR级别错误。

(强调我添加的"except")

据我所知,require不是这样工作的。唯一实际的区别是,如果不能包含文件,require将导致脚本终止,而include只会发出警告并继续执行。

一个非常重要的习惯用法取决于你所陈述的行为是否属实:有条件的必需文件。

if(is_secure_page()) {
  require "security.php";
}

requireinclude都在执行流中到达它们的位置包含它们的文件。

一个简单的测试用例是:

if (false) {
  require_once("Nonexistent.php");
}
echo "I'm doing SCIENCE and I'm still alive.'n";

假设您正在运行一个任务关键型应用程序,每秒将损失1美元。有些库只在特定情况下使用,不会影响您的业务流程。对于这些可选库,您可能应该使用includeonce。因为如果文件不存在,require将导致应用程序停止运行,并出现致命错误。

require,甚至更好的是,当您希望包含应用程序实际需要的代码时,require_once应该专门使用,例如您需要的任何库。include及其兄弟include_once仅应在所包含的文件对脚本的执行不是必需的情况下使用,例如在加载侧边栏或某些切线内容时。

这两条语句之间唯一真正的区别是没有找到文件,require抛出了一个致命错误,而include只会抛出一个警告,然后愉快地继续前进。

我相信requireinclude都是以完全相同的方式加载和解析的。如果require将在给定的上下文中加载文件,那么include也将加载。

我个人总是使用require_once,我发现在大多数情况下这正是你所需要的(要么你得到一次页面,要么你停止脚本)。include会发出警告,如果你想"尝试"包含内容,就需要隐藏这些警告。但这只是糟糕的编程实践,一个简单的if (file_exists($file)) require_once $file;就可以做到这一点,并且完全击败了include

因此,在我看来,require目前已经获胜。

PS:被打败了一秒钟!