【问题标题】:PHP require fails with no errorPHP require 失败且没有错误
【发布时间】:2012-10-08 23:32:57
【问题描述】:

这是我苦苦挣扎了几个小时的代码:

if ((require $_SESSION['ROOT_PATH'] . '/templates/core/menu_js.php') == 'OK') {
   echo 'OK';
} else {
   echo 'KO';
}

如果我正确理解了关于“require”指令的 PHP 文档,则永远不应该编写“KO”,因为如果 require 不起作用,则会引发错误。

在我的情况下,即使有错误调整,“KO”也会始终显示:

error_reporting(E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);

请注意,相同的要求(或包含)在网站的其他页面中也能完美运行。

编辑

查看文档后添加了if结构。 起初,我只有一行:

require $_SESSION['ROOT_PATH'] . '/templates/core/menu_js.php';

当我检查该行不工作时,我添加了if

顺便说一句。所需页面(当它工作时)将script 标记添加到我从未在此唯一页面上看到的调用页面。在使用此要求的任何其他页面上,脚本会出现在输出中。

所以我的问题应该是“如果没有显示所需的php文件的输出,为什么没有引发错误?”

【问题讨论】:

标签: php include require


【解决方案1】:

根据the documentation

成功的包含,除非被包含的文件覆盖,否则返回 1... 此外,还可以从包含的文件返回值。您可以像对待普通函数一样获取 include 调用的值。

所以您的文件没有返回“OK”。它返回 1(表示成功)或自定义值。

require 是一种语言结构,而不是标准函数。通过使用require,您已经表明如果找不到文件,代码应该会失败。很可能您不需要检查返回值。

【讨论】:

  • 你是对的。这就是为什么我不明白为什么会显示“KO”。
【解决方案2】:

只有当menu_js.php 包含return 'OK'; 时,这才会按您预期的方式工作。否则require 工作正常,但返回值不是“OK”,这就是触发“KO”条件的原因。 require 不返回 'OK'。如果require 不起作用,程序会立即停止,你的false 条件永远不会像你想象的那样被击中。

【讨论】:

    【解决方案3】:

    这里有一些错误:

    1. 根据 PHP 文档:

      requireinclude 相同,但在失败时也会产生致命的E_COMPILE_ERROR 级别错误。

      致命错误将停止您的脚本执行。

    2. require 返回包含文件返回的内容:

      // a.php
      return 'test';
      
      // b.php
      $result = require 'a.php';
      echo $result; // will display 'test'
      

    所以,不要测试require的返回值!使用is_file(),然后如果true,则需要该文件!

    【讨论】:

      【解决方案4】:

      你不能在if中使用require

      使用这个

      if(file_exists($_SESSION['ROOT_PATH'] . '/templates/core/menu_js.php'))
      {
       echo 'OK';
      } else {
         echo 'KO';
      }
      

      【讨论】:

      • 感谢您的回答,但正如我在问题中所说,完全相同的行(例如“要求”行)在我网站的许多其他页面中都有效,因此我确定该文件存在。
      • @jhonraymos:来自 PHP 包含手册:成功包含,除非被包含文件覆盖,否则返回 1。可以在包含文件中执行 return 语句以终止该文件中的处理并返回调用它的脚本。
      • 你的第一句话就是我的回答:你不能在 if 中使用 require 但是它在文档中的什么地方写的?
      【解决方案5】:

      虽然 require 确实不会返回任何东西,但使条件 always 返回“KO”,因为括号中的左侧值永远不会等于“OK” ,您可以通过将此脚本中的 display_errors ini 值临时设置为 On 来检查文件是否失败。

      由于您已将错误报告设置为捕获此问题,因此您的 display_errors 可能已关闭,因此不会向您显示此内容。像这样为这个脚本设置它:

      ini_set('display_errors', 'on');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-24
        相关资源
        最近更新 更多