PHP-тест теста пустого условия дает противоречивые результаты

Я извлекаю 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 проходит как истинная. Я также проверил, что в приведенном выше тесте $tempfile содержит значение «members/». Я не могу понять пустой тест переменной или тест file_exists. Я могу кодировать это, но мне интересно, почему я вижу то, что вижу. Любое понимание ценится.


person roybman    schedule 19.04.2014    source источник
comment
Вы пытались поместить его в шестнадцатеричный редактор или конвертер ascii, чтобы увидеть, есть ли какой-то странный управляющий символ? krisl.net/cgi-bin/ascbin.pl   -  person dgig    schedule 19.04.2014
comment
Я вставил обрезку при назначении переменной ($picture) из элемента xml, и теперь она возвращается как пустая, когда она пуста. До сих пор не понятно, зачем его обрезать. Я предполагаю, что при назначении пустого элемента из файла xml переменной вставляется нулевой символ, из-за чего пустой тест не проходит. Это не имеет смысла, но это все, что я могу понять прямо сейчас.   -  person roybman    schedule 19.04.2014


Ответы (1)


Для первого случая мне кажется почти невозможным быть правдой. Они оба должны быть равны. Вы пробовали обрезать?

Для функции file_exists, если вы не хотите быть правдой в каталогах, вы должны проверить !is_dir()

E.g.:

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
person Royal Bg    schedule 19.04.2014
comment
Я не пытаюсь проверить, существует ли каталог, я пытаюсь проверить, существует ли файл. Поскольку имя файла отсутствует в переменной, я ожидаю, что оно должно вернуть false. - person roybman; 19.04.2014
comment
@user3465303 user3465303 вы не понимаете мою точку зрения. Вы указали каталог и имя файла после него. Когда имя файла ПУСТО, он будет проверять только строку 'members/' или, в моем случае, 'New Folder/', которая является папкой, а папка — это файл, поэтому file_exists возвращает true. Вы хотите исключить папки из этой функции, верно? - person Royal Bg; 19.04.2014
comment
Просто для дальнейшего уточнения ожидается, что если поле xml имеет значение, то указанный файл уже должен существовать в фиксированном каталоге. Я только проверяю, чтобы убедиться, что он действительно существует. - person roybman; 19.04.2014
comment
@user3465303 user3465303 мои три теста показывают именно вашу ситуацию, но с каталогом New Folder, который содержит .txt файлов. В первом случае я проверяю, передается ли file_exists() в качестве параметра New folder/ и пустое имя файла (нет). Он возвращает TRUE (ваш случай). После этого я ставлю !is_dir(), поэтому он возвращает FALSE (результат, который вы ожидаете). После этого я пытаюсь использовать настоящее имя файла New Text Document.txt в этом каталоге, и он возвращает TRUE. Кроме того, что вы ожидаете. Вы хотите получить TRUE только в том случае, если значение не ПУСТО - person Royal Bg; 19.04.2014
comment
Хорошо, я понял твою точку зрения. В этом случае, похоже, я должен использовать is_file(). Я только что попробовал это, и это работает, как и ожидалось. Спасибо. Теперь, если я смогу лучше понять пустой тест, это будет здорово. - person roybman; 19.04.2014
comment
Я не уверен, как вы можете привести к тому, что одна переменная будет назначена другой и даст другой результат на !empty(). Возможно, это стоило поискать. - person Royal Bg; 19.04.2014
comment
Я только что попытался обрезать назначенную переменную ($picture), и она возвращается как пустая, что правильно. Тем не менее, до сих пор неясно, почему его нужно обрезать, чтобы получить тот же результат, что и поле, из которого оно получило значение. Это все еще не имеет смысла. - person roybman; 19.04.2014