【问题标题】:PHP Test of empty condition test yields inconsistent results空条件测试的PHP测试产生不一致的结果
【发布时间】:2014-06-03 13:35:42
【问题描述】:

我正在提取一个 XML 文件并执行各种数据按摩。我将一个元素(没有数据)分配给一个变量并测试该变量是否为空。测试是假的。不知道为什么,我直接测试了元素,它通过了。对此感到困惑,我将变量置于几个条件下,只是为了看看我在处理什么。这让我感到困惑,因为结果对我来说似乎完全不一致。 我输入的代码如下:

$xmldata = simplexml_load_file('data.xml');
$picture = $person->picturefile;       <--picturefile is empty
if (!empty($person->picturefile)) {
    echo "picture is not empty";
    } else {
    echo "picture is empty";
    }

if (!empty($picture)) {
    echo "picture is not empty";
    } else {
    echo "picture is empty";
    }

$tempfile = "members/$picture";
if (file_exists($tempfile)) {
   echo "<div class=mgridimg><img src=$tempfile></div>";
}

xml 路径的测试产生一个假条件(图片为空),但变量的测试产生一个真条件(图片不为空)。
我对变量进行了 strlen 测试,结果显示 strlen = 0。

从 xml 文件中,$picture 在填充时有一个文件名。 同样令人费解的是,尽管 $picture 为空,但 file_exists 测试通过了 true。 我还验证了在上面的测试中,$tempfile 包含一个值“members/”。 我无法理解变量的空测试或 file_exists 测试。 我可以围绕这个进行编码,但我想知道为什么我会看到我所看到的。 任何见解都值得赞赏。

【问题讨论】:

  • 您是否尝试将其放入十六进制编辑器或 ascii 转换器中以查看是否有一些奇怪的控制字符? krisl.net/cgi-bin/ascbin.pl
  • 我在从 xml 元素分配变量 ($picture) 时进行了修剪,现在它在为空时返回为空。目前还不清楚为什么需要修剪。我猜测在将 xml 文件中的空元素分配给变量时,会插入一个空字符,这会导致空测试不通过。这没有意义,但这是我现在能想到的。

标签: php file-exists string


【解决方案1】:

对于第一种情况,在我看来几乎不可能是真的。他们应该是平等的。你试过修剪吗?

对于 file_exists 函数,如果您不想在 dir 上为 true,则应检查 !is_dir()

例如:

var_dump(file_exists('New Folder/'));

var_dump(file_exists('New Folder/') && !is_dir('New Folder/'));

var_dump(file_exists('New Folder/New Text Document.txt') && !is_dir('New Folder/New Text Document.txt'));

输出:

boolean true

boolean false

boolean true

【讨论】:

  • 我不是在测试目录是否存在,我是在测试文件是否存在。由于变量中缺少文件名,我希望它应该返回 false。
  • @user3465303 你不明白我的意思。您已经在其后指向了一个目录和一个文件名。当文件名为空白时,它将仅测试字符串'members/' 或在我的情况下测试'New Folder/' 是文件夹,并且文件夹是文件,这就是file_exists 返回true 的原因。你想从这个函数中排除文件夹,对吧?
  • 只是为了进一步澄清,期望如果xml字段有值,那么命名的文件应该已经存在于固定目录中。我只是在测试以确保它确实存在。
  • @user3465303 我的三个测试准确地显示了您的情况,但有一个目录New Folder,其中包含一个.txt 文件。在第一种情况下,我测试file_exists() 是否作为参数传递New folder/ 和空白文件名(无)。它返回 TRUE(您的情况)。之后我输入了!is_dir(),所以它返回 FALSE(你期望的结果)。之后我尝试在这个目录中使用真实文件名New Text Document.txt,它返回TRUE。也是你所期望的。仅当值不是 EMPTY 时,您才想收到 TRUE
  • 好的,我明白了。在这种情况下,看起来我应该使用 is_file()。我刚刚尝试过,它按预期工作。谢谢。现在,如果我能更好地理解空测试,那就太好了。
猜你喜欢
  • 1970-01-01
  • 2016-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-12
  • 2016-06-03
  • 2012-02-19
  • 1970-01-01
相关资源
最近更新 更多