Объяснение while(false !== ($ f=readdir($d))){

#php #directory #conditional-statements

#php #каталог #условные операторы

Вопрос:

Я только начал практиковать ООП в php с помощью книги «Концепции, методы и коды». К сожалению, я никогда не работал с каталогами и файлами на PHP и испытываю трудности с пониманием этого условия, вот полный код

 function DirectoryItems($directory){
  $d = "";
  if(is_dir($directory)){
     $d = opendir($directory) or die("Couldn't open directory.");
     while(false !== ($f=readdir($d))){
      if(is_file("$directory/$f")){
      $this->filearray[] = $f;
}
}
closedir($d);
}else{
//error
die("Must pass in a directory.");
}
}
  

Все, что я могу понять, это то, что сначала мы проверяем параметр, который является его каталогом, после этого мы открываем этот каталог, а затем читаем каталог и помещаем все файлы в каталог в массив, но условие сбивает меня с толку, что это за чертовщина!== Я знаю только о !=

Кстати, эта книга написана на PHP4 и 5

Ответ №1:

!== похоже на != но в дополнение к проверке равенства он также проверяет тип.

Это важное различие, потому что иногда что-то является «ложным» или «правдивым», но на самом деле это не логический тип со значением false или true. Например, число 0 обычно рассматривается как false .

Вторая немного запутанная часть здесь заключается в том, что код проверяет false !== (assignment) в цикле while . Это в основном проверка, было ли присвоено допустимое значение.

Итак, чтобы вывести все это вместе, код:

 while(false !== ($f=readdir($d))
  

…переводится примерно как:

While $f присваивается объект из readdir($d) do …

Комментарии:

1. Будьте очень осторожны, этот код только что стоил мне поздней ночи: когда каталог не существует, это создает бесконечный цикл. Наряду с протоколированием ошибок при каждой попытке. этот цикл — кошмар! Проблема в том, что он не возвращает явное логическое значение false, когда сам ресурс каталога равен false . Похоже, отчасти виновата документация для этой функции!

Ответ №2:

=== означает «равное значение и равный тип»
!== означает «не равное значение или не равный тип»

Использование == , и пустая строка равна false . === Однако при использовании они не равны, потому что тип отличается.

!= и !== работают таким же образом. Дополнительный = знак означает, что тип также должен быть проверен, а не только эквивалентные значения.

Комментарии:

1. итак, в этом условии мы удостоверяемся, что значения и типы файлов равны, и это означает, что мы помещаем файлы с похожими типами в массив?

2. Ключевое слово здесь — принуждение к типу.

Ответ №3:

== Будет принудительно приводить значения к одному и тому же типу для их сравнения. Если readdir возвращает 0 , то False==0 , вероятно, будет оценено как true . Однако False===0 это не будет правдой.

Есть много людей, которые знают намного больше об операторах сравнения, приведении типов, типах значений и т. Д. Я удалю это, когда они ответят.