在PHP中同时包含和需要构造有什么意义?

Age*_*rum 7 php language-design require include

我是第一次编写PHP应用程序(玩具和练习除外),我很难理解为什么PHP包含一个include和一个require构造.

在你写一个解释两者之间差异的答案之前,让我首先说我确实理解了差异 - include产生警告并继续前进,并require产生致命错误.我的问题是:你想什么时候包括,但不需要文件?

也许这对我来说是想象力的失败,但我的应用程序中似乎没有任何文件,如果他们不在那里我不想尖叫.奇怪的是,这并没有让我想要使用,require因为它似乎无法正确处理失败require,所以我使用了一个帮助函数(警告:空气代码):

public static function include($filename) {
  if (is_readable($filename)) {
    if (!@include($filename)) {
      throw new FileNotFoundException("File deleted after readable check");
    }
  } else {
    throw new FileNotFoundException("File missing or unreadable");
  }
}
Run Code Online (Sandbox Code Playgroud)

我想我要问的是:

  • 什么样的文件,你会真的要选择性地包括一个应用程序?
  • 无论你想成为一个文件需要可选的,你为什么不只是处理,在像我上面写的代码的修改版本的功能?

dec*_*eze 2

我将用于require加载应用程序本身必需的文件,require 'database_config.php'require '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.
Run Code Online (Sandbox Code Playgroud)

在某些时候,您只需依赖基本文件,即使它只是您的错误处理程序。您必须引入额外的代码来优雅地处理丢失的错误处理程序,即使这样,您能做的最好的事情就是输出一些错误(die除非您想优雅地捕获错误,即使您的错误处理程序没有存在)。最好简单地require 'error_handler.php'include如果您愿意,您可以自定义处理此后的所有内容。

  • @Agent 我确信@deceze 在说“优雅地*”时并不是指“死”;) (2认同)