Странный PHP, если поведение с приведенным к булевому int

0

посмотрим, может ли кто-нибудь помочь мне.

У меня есть функция, называемая ret_error(), которая вызывается, когда появляется ошибка доступа к таблице в базе данных, а это значит, что "не удалось подключиться", "запись не найдена" и тому подобное. Эти функции возвращают массив с двумя ключами, подобными этому

array('error' => true, 'code' => Model::RECORD_NOT_FOUND);

Если я вызываю функцию, которая возвращает массив, построенный с помощью ret_error(), и я проверяю массив, это похоже на

$result = array('error' => 1, 'code' => Model::RECORD_NOT_FOUND);

Но когда я оцениваю с помощью 'if'

if (!$result['error']) {
   do something;
}
else {
   do something else;
}

Всегда оценивается как false, даже если я передал логическое значение.

Это работает правильно, если оценивается как int, например

if ($result['error'] != 1) {

Есть что-то, что мне не хватает?

  • 0
    Как насчет if($result['error'] === true) ? таким образом три === заставят быть полностью равными. Как вы знаете, 0 интерпретируется как false а 1 как true в программировании.
Теги:
arrays
if-statement

1 ответ

0

При преобразовании в boolean следующие значения считаются FALSE:

  • сама логическая ЛОЖЬ
  • целое число 0 (ноль)
  • поплавок 0.0 (ноль)
  • пустая строка и строка "0",
  • массив с нулевыми элементами
  • объект с нулевыми переменными-членами (только для PHP 4)
  • специальный тип NULL (включая неустановленные переменные)
  • Объекты SimpleXML, созданные из пустых тегов

Короче говоря, 0 - False, а все остальные значения True. Я бы предложил быстрый взломать

if($result['error'] === true || $result['error'] === 1) {
   //logic
}
  • 1
    Я не могу удержаться от этого, даже если это ОТ. PHP глуп: «пустая строка, а строка« 0 »»! Я так очень ненавижу это ... Что за черт, почему на земле непустая строка "0" ложная? Это всегда беспокоило меня ... PS: я PHP-разработчик начиная с PHP4, я могу сказать, что PHP глуп :-)
  • 0
    LOL, хорошая мысль от вас. Я все еще думаю, что у них, вероятно, есть веская историческая причина, чтобы заставить это работать таким образом. Между тем, целое число 0 является ложным, поэтому было бы более разумно иметь строку «0», чтобы быть ложным. В противном случае, если вы приведете int 0 к строке «0», вы в основном преобразуете его из False в True (это может вызвать путаницу).
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню