【问题标题】:How are include_once loops handled in php?php 中如何处理 include_once 循环?
【发布时间】:2016-12-28 07:38:01
【问题描述】:

我有 3 个不同的文件-

  1. fileMainIncludeEverywhere.php

    ...
    include_once('fileMinorInclude.php');
    ?>
    
  2. fileMinorInclude.php

    ...
    include_once('fileMainIncludeEverywhere.php');
    ...
    
  3. fileToRun.php

    ...
    include_once('fileMainIncludeEverywhere.php');
    ...
    

我有很多文件,例如 fileToRun.php

目前我的代码没有遇到任何错误,但我想知道是否有任何情况会失败?

【问题讨论】:

  • 没有错误。在发布到 SO - secure.php.net/manual/en/function.include-once.php 之前,您应该尝试阅读手册。我觉得很清楚?
  • 你测试的时候发生了什么?
  • @S.Pinkus 我已经阅读了手册,上面写着如果该文件已被包含,则不会再次包含该文件。但就我而言,该文件甚至没有被包含过一次。
  • @symcbean 我还没有遇到任何错误,但是我有成千上万个文件,比如我上面提到的第三个文件,其中有太多不同的情况。所以我需要专家的一些保证。
  • @Rahul “但在我的情况下,该文件甚至没有被包含过一次” - 啊。这就是为什么除非你有特殊的理由,否则你应该使用require_once() 而不是include_once()

标签: php php-5.3 php-5.4


【解决方案1】:

我认为在这种情况下没有错误。因为include_once 只会第一次加载文件,所以即将到来的加载请求将被同一文件拒绝。

从你的例子来看:

  1. fileToRun.php 将加载 fileMainIncludeEverywhere.php(第一次调用)
  2. fileMainIncludeEverywhere.php 将加载 fileMinorInclude.php(第一次调用)
  3. fileMinorInclude.php 将调用加载 fileMainIncludeEverywhere.php 但它会被拒绝,因为它已经在第一步加载。

希望它会有所帮助。

【讨论】:

  • 这似乎是一个很好的推理。有人在他们的代码库中这样做过吗?
【解决方案2】:

include_once:

include_once 语句在脚本执行期间包含并评估指定文件。这是一种类似于 include 语句的行为,唯一的区别是如果文件中的代码已经被包含,它将不会再次被包含,并且 include_once 返回 TRUE。顾名思义,该文件将只包含一次。

这里的“来自文件的代码”也包含执行的 PHP 文件。

请注意,使用 require_once() 而不是 include_once() 通常是最佳做法,除非您有使用 include_once() 的特定原因(比如包含可选模板组件)。这是因为如果找不到所需的资源,require_once() 将终止(fail fast),而无法正常找到它应该是终端故障。

【讨论】:

  • 我有一个特殊要求,如果出现错误(就像你所说的可选组件),我希望不包含它。
猜你喜欢
  • 2016-04-28
  • 2015-01-11
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
  • 2021-07-14
  • 2022-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多