空条件测试的PHP测试产生不一致的结果

空条件测试的PHP测试产生不一致的结果,php,file-exists,string,Php,File Exists,String,我正在拉入一个XML文件并执行各种数据处理。我将一个元素(没有数据)分配给一个变量,并测试该变量是否为空。测试是错误的。不知道为什么,我直接测试了元素,结果它通过了测试。对此感到困惑,我将变量放入了几个条件中,只是想看看我在处理什么。这让我感到困惑,因为结果在我看来完全不一致。 我的代码如下: $xmldata = simplexml_load_file('data.xml'); $picture = $person->picturefile; <--picturefil

我正在拉入一个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>";
}
$xmldata=simplexml\u load\u文件('data.xml');
$picture=$person->picturefile;图片文件){
回声“图片不是空的”;
}否则{
回声“图片是空的”;
}
如果(!空($picture)){
回声“图片不是空的”;
}否则{
回声“图片是空的”;
}
$tempfile=“members/$picture”;
如果(文件_存在($tempfile)){
回声“;
}
xml路径的测试产生一个假条件(图片为空),但变量的测试产生一个真条件(图片不为空)。
我对变量进行了strlen测试,结果显示strlen=0

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

对于第一个案例,我觉得几乎不可能是真的。他们应该是平等的。你试过修剪吗

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

例如:

产出:

boolean true

boolean false

boolean true

您是否尝试过将其放入十六进制编辑器或ascii转换器中,以查看是否存在一些奇怪的控制字符?我在从xml元素分配变量($picture)时进行了修剪,现在它为空时返回为空。现在还不清楚为什么需要修剪。我猜在将xml文件中的空元素分配给变量时,会插入一个空字符,这会导致空测试无法通过。这没有什么意义,但我现在只能知道。我不是在测试目录是否存在,而是在测试文件是否存在。由于变量中缺少文件名,我希望它返回false。@user3465303您不明白我的意思。您已经在它后面指出了一个目录和一个文件名。当文件名为空时,它将只测试字符串
'members/'
,或者在我的例子中测试
'newfolder/'
,它是Folder,而Folder是file,这就是file\u exists返回true的原因。您想从这个函数中排除文件夹,对吗?只是想进一步澄清一下,如果xml字段有一个值,那么名为altready的文件应该存在于固定目录中。我只是测试以确保它确实存在。@user3465303我的三个测试准确地显示了您的情况,但其中有一个目录
新文件夹
,其中包含
.txt
文件。在第一种情况下,当作为参数传递
newfolder/
和一个空白文件名(none)时,我测试
file\u是否存在()。它返回真(你的情况)。后来我把
!是_dir()
,因此它返回FALSE(您期望的结果)。之后,我尝试使用该目录中的真实文件名
newtext Document.txt
,它返回
TRUE
。也是你所期望的。只有当值不是EMPTYok时,您才想接收
TRUE
,我明白您的意思。在这种情况下,看起来我应该使用is_file()。我刚试了一下,效果如预期。谢谢现在,如果我能更好地理解空测试,那就太好了。
boolean true

boolean false

boolean true