文件不存在但可以require_once()它

时间:2013-08-24 21:27:42

标签: php windows filesystems require file-exists

start.php

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

的config.php

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

我有PHP版本5.3.8的Windows XP + XAMPP 如果我运行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()声称不存在的文件?

3 个答案:

答案 0 :(得分:2)

制作一个require(或include)条件是你根本不应该做的事情:

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

相反,如果不是必须,请选择include,如果必须,则选择require。另见:

将include / require包含在条件中会使这些变得复杂,并且包含通常与程序流程相关,您真的希望保持简单。

此外,您可能希望稍后使用某些优化条件包含。

在你的情况下,我想知道为什么你实际检查文件是否存在。而require_once你肯定意味着include_once而不是include_once('/config.php'); ,而if是多余的:

{{1}}

答案 1 :(得分:1)

这就是我认为的。

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

答案 2 :(得分:0)

问题是/config.php实际上意味着C:/config.php

File_exists()仅检查实际文件或文件夹(如果存在),如果不存在,则会检查falseRequire_once()做了更多。根据PHP手册,此函数几乎与require()相同,几乎与include()相同。在我们的例子中,不相同的部分并不重要。重要的是,手册中说的包括:

  

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

由于config.php位于start.php所在的同一目录中,因此在require_once()发现config.php不在C:/之后,它已搜索并找到了start.php称呼他的目录。 <{1}}不执行此搜索,因此返回false并且无法调用File_exists()

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