Каков наилучший способ превратить переменную в boolean в php?

Я читал этот вопрос и увидел эту строку:

if ($a == $b) { return true } else { return false }

И это заставило меня задаться вопросом, как лучше всего использовать переменную неизвестного типа (может быть строка, может быть int, кто знает? кто заботится?) до логического?

Конечно, if ($var) { return true; } else { return false; } сделал бы трюк, но я думаю, что return $var ? true : false;, вероятно, лучше.

В этом отношении:

  • return $var && true
  • return $var || false
  • return !empty($var)

все, наверное, лучше, но есть ли лучший способ бросить на bool? Что еще более важно, что делает его лучше?

Изменить, чтобы уточнить:

Это не было написано с целью быть исчерпывающим списком способов перевода в логическое. Мой вопрос специально для явного литья. Прежде чем я узнал о empty, я использовал isset($var) && $var, так как это предотвратило бы распространение ошибок на необъявленные переменные. Теперь я использую !empty($var), поскольку он быстрее набирает.

!empty имеет преимущество (dis) не бросать любые ошибки E_NOTICE, когда переменная не определена. Это можно считать хорошим, если вы проверяете переменные $_GET или $_SESSION, для большинства других переменных, я полагаю, это можно считать плохим, поскольку это скроет проблемы, когда переменная не инициализируется там, где она должна была быть инициализирована.

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

Ответы

Ответ 1

Два способа:

  • Явный листинг:

    Это когда вы явно передаете переменную, используя литеральный оператор-литье (bool).

    return (bool) $expression;
    
  • Неявный листинг (с использованием операторов):

    Здесь тип выводится из выражения. В PHP это включает логические операторы и операторы сравнения, и любой конструктор функции/языка, который ожидает логическое значение, например if и while:

    return !!$expression;
    

    или

    return $expression == true;
    

    или

    return $a == $b;
    

    или

    return $a > 1;
    

    или

    if ($a)
    

Все методы попадут в одну из этих двух категорий.

Мое предложение состоит в том, что если вы используете какие-либо операторы (==, !=, > и т.д.), не беспокойтесь о литье. Но если вы просто возвращаете переменную, то явно выполняете...

Ответ 2

Я лично всегда использую

(bool)$var;

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

!!$var;

Я считаю, что немного читать трудно.

Ответ 3

То, что я видел чаще всего в JavaScript: Двойное отрицание

return !!$var;

Объяснение:

!$var оценивает $var на противоположное логическое значение (если $var не является логическим значением, это преобразован в boolean first (преобразование типа)), а второй ! снова инвертирует это значение, что приводит к логическому значению, $var тоже будет оцениваться.

Это лучшее? Это зависит от ваших критериев. Как уже упоминалось, это может быть труднее понять (хотя это ничего особенного), но это, безусловно, самая короткая версия;)

Может также зависеть, какие значения вы считаете true и false. Эти значения по умолчанию оцениваются до false:

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

Update:

Я думаю, что в целом можно сказать, что каждый код, который позволяет явно возвращать true или false, лучше. Будь то через явное преобразование или неявное преобразование типа. Конечно, ясное (по определению) должно быть легче понять.

Наличие кода, такого как return $a ? true : false, является избыточным. Особенно

if ($a == $b) { return true } else { return false }

который можно просто записать как return ($a == $b).

Должна быть причина, по которой это было недооценено в моих подчиненных;).

Update2:

Я бы избегал выражения типа return $var && true. В PHP он возвращает логическое значение, но, например, в JavaScript или Python, оно вернет значение $var, если оно будет равно true. И на этих языках этот "трюк" используется специально для достижения определенных эффектов. Поэтому для людей (более), знакомых с этими языками, может быть не очевидно (без документации или контекста), что нужно возвращать только логическое значение.

Ответ 4

Каков наилучший способ применить переменную неизвестного типа (может быть строка, может быть int, кто знает? кто заботится?) до логического?

return (bool)$var;