1

开始.php

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

配置文件

<?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()声称不存在的文件?

4

3 回答 3

2

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

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

取而代之的是include,如果不是必须的,则采取,或者require如果必须,则采取。另见:

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

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

就您而言,我想知道您为什么要实际检查文件是否存在。而不是require_once你最肯定的意思include_once, if 是多余的:

include_once('/config.php');
于 2013-08-24T21:36:16.243 回答
1

这就是我的想法。

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

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

一个.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
于 2013-08-24T21:52:21.097 回答
0

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

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

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

因为config.php是在同一个目录下start.php,后来require_once()发现不在,config.php在叫他C:/的目录下找了找。不进行此搜索,因此它返回 false 并且无法调用。start.phpFile_exists()require_once()

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

于 2013-08-24T22:42:48.713 回答