【问题标题】:File doesn't exist but can require_once() it文件不存在但可以 require_once() 它
【发布时间】:2013-08-27 17:05:46
【问题描述】:

start.php

<?php
if(file_exists('/config.php')) require_once('/config.php');
echo TEST;
?>

config.php

<?php
define('TEST','Hamsters');
?>

我有 Windows XP + XAMPP 和 PHP 版本 5.3.8。
如果我运行 start.php 它会给我这个错误:

注意:使用未定义的常量 TEST - 在第 3 行的 C:\programs\xampp\htdocs\start.php 中假定为“TEST”

现在我将 start.php 修改为以下内容,他给了我我的Hamsters

<?php
require_once('/config.php');
echo TEST;
?>

file_exists() 怎么能说文件不存在但没有条件仍然可以require_once() 声称不存在的文件?

【问题讨论】:

  • 哇,这让我想起了圣经中的故事,比如在没有怀孕的情况下分娩。请放心,当 PHP 需要一个文件时,它确实存在。只是根据定义。所以你应该更想知道你认为它不存在的事实。
  • 哦,如果你不知道,有一个叫做 include_path 的东西,它是一个设置:php.net/include_path
  • 可能是因为领先的/。如果您的文件位于 C:\Web\path\to\website\ 那么包括 /config.php 将包括 C:\config.php。

标签: php windows filesystems require file-exists


【解决方案1】:

要求(或包含)条件是您根本不应该做的事情:

if (file_exists('/config.php')) {
  require_once('/config.php');
}

如果不是必须的,请选择include,如果必须,请选择require。另请参阅:

将 include/require 包装到条件中会使这些条件变得复杂,因为 include 通常与您真正希望保持简单的程序流程相关。

此外,您以后可能想要使用的一些优化对于条件包含是不可能的。

在您的情况下,我想知道您为什么实际检查文件是否存在。而不是require_once,你肯定是指include_once,if 是多余的:

include_once('/config.php');

【讨论】:

  • 比这个问题怎么样:How to include only if file exists?
  • 那么这个问题应该是什么?它在技术上给出了正确的答案,但是,只能以这种方式完成某些事情,这并不意味着您应该那样做。我的意思是互联网。你会发现足够多的疯子认为某些东西很酷或足够好(或者甚至不像现在所说的那样棒。一切都棒极了)。真的,如果文件不存在,include 不会中断,回答这个问题的人一定错过了清楚地指出这一点。
  • 好的,我明白你说的。您的回答很有帮助,但没有回答问题。
  • 好吧,该文件确实存在于包含路径中,但是当您使用file_exist 时,您不会搜索该文件包含路径中我>。这就是我上面已经评论过的。答案仍然有效。只需使用include_once,它将在包含路径中测试该文件,如果存在,将包含。如果没有,将留下警告。
【解决方案2】:

这就是我的想法。

require_once 尽最大努力查找文件,如果它在工作目录或调用脚本的目录中找到文件,它将将该目录视为根目录,以便解释前导斜杠。

file_exists 更严格:它查找该绝对文件系统路径并报告它未找到。

a.php:

echo 'a';

主脚本:

require_once ('/a.php');
echo '<br/>',file_exists('/a.php') ? 'exists' : 'not';

产量:

a
not

确认:

require_once ('./a.php');
echo '<br/>',file_exists('./a.php') ? 'exists' : 'not';

产量:

a
exists

【讨论】:

  • @totymedli:你在“答案”中所说的一切都是真实的。我在发布之前阅读了手册,并假设你也有。它还明确指出:“如果定义了路径——无论是绝对路径(在 Windows 上以驱动器号或 \ 开头,或在 Unix/Linux 系统上以 / 开头)还是相对于当前目录(以 . 或 .. 开头)——include_path将被完全忽略。”这里唯一有趣的是 require_once 最终忽略了前导斜线。
【解决方案3】:

问题是/config.php 实际上是指C:/config.php

File_exists() 仅检查 实际 文件或文件夹是否存在,如果不存在,它将给出false
Require_once() 做更多。根据 PHP 手册,此函数与 require() 几乎相同,与 include() 几乎相同。在我们的例子中,不相同的部分并不重要。手册中提到的重要内容包括:

根据给定的文件路径包含文件,如果没有给出,则根据指定的 include_path。 如果在 include_path 中没有找到该文件,则 include 最终会在失败前检查调用脚本自己的目录和当前工作目录。

因为config.phpstart.php在同一个目录下,所以require_once()发现config.php不在C:/里面,所以在start.php打电话给他的目录下搜索发现。 File_exists() 不执行此搜索,因此它返回 false 并且无法调用 require_once()

如果我将config.php 文件复制到C:/,它也可以使用file_exists() 方式。

【讨论】:

    猜你喜欢
    • 2015-12-19
    • 2014-06-20
    • 2015-02-27
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    相关资源
    最近更新 更多