【问题标题】:A practical scenario for using include(), include_once() and require() constructs使用 include()、include_once() 和 require() 构造的实际场景
【发布时间】:2012-11-01 20:44:32
【问题描述】:

includeinclude_oncerequirerequire_once 中,我总是只使用require_once。许多第三方框架也只使用require_once

谁能描述一个必须使用另一个构造的真实场景?

【问题讨论】:

标签: php require-once


【解决方案1】:

恕我直言,没有适合 includeinclude_once 的真实场景,原因有二:

  1. 您不太可能打算包含一个文件,同时您并不真正关心它是否包含(例如,如果文件不存在并且继续执行)。
  2. 即使是这样,include 也会发出一个错误风格的警告(零警告代码是一件值得努力的事情)。大多数情况下,您可以通过像is_file 这样的检查来防止这种情况发生,但是您知道该文件确实存在,那么为什么不require 它呢?

对于requirerequire_once:如果一个文件可以合法地被多次解析(例如一个HTML 模板),则使用前者。如果它将代码带入您的应用程序(绝大多数情况下),请使用后者。

【讨论】:

  • 在php手册Note that is_file() returns false if the parent directory doesn't have +x set for you; this make sense, but other functions such as readdir() don't seem to have this limitation. The end result is that you can loop through a directory's files but is_file() will always fail.中有一条关于is_file的匿名有用评论来源:us2.php.net/manual/en/function.is-file.php#107403
【解决方案2】:

The require_once() 语句与require() 相同,只是 PHP 会检查文件是否已被包含,如果是,则不再包含(要求)它。

require() 函数与include() 相同,只是它处理错误的方式不同。如果发生错误,include() 函数会生成警告,但脚本会继续执行。 require() 生成一个致命错误,脚本将停止。

include/requireinclude_once/require_once 语句之间的唯一区别是实际加载给定文件的次数。使用include_once/require_once 语句时,无法多次加载或执行文件。如果尝试使用这两种方法之一加载文件两次,它将被忽略。因为在一个脚本中多次定义同一个函数是不可接受的,所以这些函数允许开发者根据需要包含一个脚本,而不必检查它之前是否已经加载过。

<?php

    include ('library.inc');      
    $leap = is_leapyear(2003);
 

    require ('library.inc');     
    $leap = is_leapyear(2003);

?>

如果两个语句都允许当前脚本执行单独文件中的代码,那么两者有什么区别?

有两个主要区别:

第一个是返回值的能力,第二个是在什么情况下加载请求的文件。当使用include 语句时,PHP 会延迟请求文件的实际加载,直到脚本到达执行include 语句的点,并用文件的内容替换include 语句。相反,在require 语句的情况下,require 语句将替换为请求文件的内容,而不管require 语句(以及文件的内容)是否会在正常进程中执行脚本。

引用http://82.157.70.109/mirrorbooks/php5/067232511X/ch01lev1sec8.html以上段落

注意

从外部文件返回值的能力仅限于 include 和 include_once 语句。 require 和 require_once 语句不能以这种方式使用。

requireFatal errorincludeWarning

【讨论】:

  • 你最后的笔记;关于return 的使用不正确。 require 可以像 include 一样将 return 值。
  • 好吧,php.net/manual/en/function.require.php 并没有提到不支持它,并且快速测试脚本得出结论它可以像 include 那样工作。
  • @Reza 只是告诉...没有任何意义。提供有关您认为错误的相关部分的信息还提供链接,说明该部分是错误的
  • 这个答案大部分是来自82.157.70.109/mirrorbooks/php5/067232511X/ch01lev1sec8.html的复制粘贴——我认为最好在答案中引用你的来源:)
  • @AmalMurali 它不算大部分答案,因为它有 IP 地址,所以不允许引用它作为链接.. 虽然这个问题是 stackoverflow.com/questions/2418473/…
【解决方案3】:

include 构造在找不到文件时会发出警告;这是与require 不同的行为,它将发出致命的E_COMPILE_ERROR 级别错误。

同样的区别也适用于include_oncerequire_once

在使用 include 和使用 require 时,Difference between require, include and require_once? 的回答中描述得非常好

在我看来,有两件事。

  1. 如果你有一些东西,这是绝对需要出现在你的应用程序中的,你应该使用require/require_once来包含这样的定义。这样一来,您将收到致命错误而不是警告,并且在开发过程中可以简化查找有问题的代码。
  2. 如果您包含外部资源或可能缺少的东西,则应将其包含在 include/include_once 中,以便能够使用 @ 运算符抑制可能的包含错误。

【讨论】:

    猜你喜欢
    • 2012-07-08
    • 2011-12-08
    • 2011-01-25
    • 1970-01-01
    • 2011-04-12
    相关资源
    最近更新 更多