什么';在PHP中同时使用include和require结构有什么意义?

什么';在PHP中同时使用include和require结构有什么意义?,php,include,language-design,require,Php,Include,Language Design,Require,我是第一次编写一个PHP应用程序(除了玩具和练习),我不明白为什么PHP同时包含include和require结构 在你写一个解释两者之间差异的答案之前,首先让我说我确实理解差异-include产生警告并继续,而require产生致命错误。我的问题是:您希望何时包括但不需要文件 也许这是我想像力的失败,但在我的应用程序中似乎没有任何文件是我不想尖叫的,如果它们不存在的话。奇怪的是,这并没有让我想使用require,因为似乎不可能正确处理失败的require,所以我使用了一个助手函数(警告:air

我是第一次编写一个PHP应用程序(除了玩具和练习),我不明白为什么PHP同时包含
include
require
结构

在你写一个解释两者之间差异的答案之前,首先让我说我确实理解差异-
include
产生警告并继续,而
require
产生致命错误。我的问题是:您希望何时包括但不需要文件

也许这是我想像力的失败,但在我的应用程序中似乎没有任何文件是我不想尖叫的,如果它们不存在的话。奇怪的是,这并没有让我想使用
require
,因为似乎不可能正确处理失败的
require
,所以我使用了一个助手函数(警告:air code):

我想我要问的是:

  • 您真正希望在应用程序中包含哪些类型的文件
  • 无论您是否希望文件是必需的还是可选的,为什么不在我上面编写的代码的修改版本这样的函数中处理它呢

我会使用
require
加载应用程序本身所必需的文件,即
需要“database\u config.php”
需要“core.php”
。如果失败了,你希望它尽可能快、硬、无情地失败,因为你的应用程序安装显然有问题。在这种状态下,甚至不能保证它能够正确处理抛出的异常,
require
在没有任何额外代码的情况下生成非常清晰的错误消息

include
应该用于模板文件之类的东西,当应用程序已经启动并运行时,您希望使用这些文件,并且可以优雅地处理自己的错误


例如:

include 'error_handler.php';
set_error_handler('error_handler');

/* something bad happens */

Warning: 'error_handler.php' not found!
Error: Specified error handler "error_handler" doesn't exist.
在某些情况下,您仅仅依赖于基本文件,即使它只是您的错误处理程序。您必须引入额外的代码来优雅地处理丢失的错误处理程序,即使这样,您也只能输出一些错误并
die
(除非您想在错误处理程序不存在的情况下优雅地捕获错误)。最好只要求“error_handler.php”;如果愿意,您可以
包括
并自定义处理此操作之后的所有内容

你真正想要什么样的文件 希望选择性地包含在 申请

我通常将
include
与静态HTML块(页眉、页脚、菜单、搜索框、调查表等)一起使用,将
require
与PHP函数或类一起使用。页脚块不太可能消失,但是,当我看代码时,我想这是一个很好的视觉线索

无论您是否希望保存文件 必选或可选,为什么不呢 在函数中处理它,就像 我编写的代码的修改版本 在上面


@operator被认为是昂贵的,而且,无论如何,我认为包含一个外部文件是一个基本的操作,应该包含在basic语言中。您的代码还添加了一个新的依赖项:如果您将其存储在一个必需的块中,那么您的可选块将不再是100%可选的;-)

@Gordon的可能副本——我会链接到您的答案,我发现它比公认的答案更具信息性:)@Agent可能的示例:
require'defaultSettings.php';包括“userProvidedOverloadForDefaultSettings.php”基本上,可以包括任何覆盖现有值或在未提供时不会立即中断应用程序的内容。我同意大多数时候你会想使用
require
。@Agent IMO,在无法捕获异常时,尝试处理不可处理的情况或抛出异常是没有意义的。缺少核心库是不可处理的。那么,你所能做的就是告诉用户。但对于这一点,您可以使用
register\u shutdown\u函数
error\u get\u last()
查看是否有错误,并发送500个标题和一个漂亮的页面。但同样,是的,对于那些不可处理的情况,您也可以使用include和
set\u exception\u处理程序。我不会想太多的。要务实。戈登:那是有道理的。在他的回答下和@deceze聊了一会儿之后,我意识到我的整个问题是多么愚蠢。如果一个重要的类或模板文件完全丢失,要么是我搞砸了,我需要坦白道歉,要么是服务器发生了疯狂的事情,在这种情况下,这超出了我的控制范围,我在托管公司有一个非常好的替罪羊;)我真的需要接受“现在起作用”的哲学。我一直陷入过早优化和航天体系结构的陷阱。对我来说,缺少模板文件似乎是一件非常关键的事情。它向我表明,要么应用程序部署不正确,要么某个关键的东西(我认为“实际显示给用户的东西”是关键的)神秘地消失了,使应用程序处于不稳定状态。我宁愿在函数中捕获所有这些,并抛出一个异常来提醒我,而不是仅仅向用户抛出一条丑陋的
die()
消息。也许我还远远不够找到一个我认为不重要的文件。@我确信,“当你优雅地说,欺骗并不意味着<代码>骰子< /代码>。”当然,缺少模板文件是件可怕的事情。这就是为什么你试图
包括
它,记录错误,发送电子邮件,如果找不到404页面,就优雅地提供404页面。当基本的
必需的
文件找不到时,应用程序不能完成所有这些事情,这就是为什么一个使用
包含
,另一个使用
必需
。@Gordon:在我的问题中,我说我反对
include 'error_handler.php';
set_error_handler('error_handler');

/* something bad happens */

Warning: 'error_handler.php' not found!
Error: Specified error handler "error_handler" doesn't exist.