Какой лучший способ преобразовать переменную в логическое значение в php? - PullRequest
15 голосов
/ 04 февраля 2011

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

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

И это заставило меня задуматься, каков наилучший способ приведения переменной неизвестного типа (может бытьstring, может быть 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, для большинства других переменных, я полагаю, это может считаться плохим, поскольку это скрыло бы проблемы, где переменная неинициализирована там, где ее нужно было инициализировать.

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

Ответы [ 5 ]

22 голосов
/ 04 февраля 2011

Два способа:

  1. Явное приведение:

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

    return (bool) $expression;
    
  2. Неявное приведение (с использованием операторов):

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

    return !!$expression;
    

    или

    return $expression == true;
    

    или

    return $a == $b;
    

    или

    return $a > 1;
    

    или

    if ($a)
    

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

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

13 голосов
/ 04 февраля 2011

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

(bool)$var;

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

!!$var;

Я считаю, что этот текст немного труден для чтения.

5 голосов
/ 04 февраля 2011

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

return !!$var;

Объяснение:

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

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

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

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

Обновление:

Я думаю, что вВ общем, можно сказать, что каждый код, который избегает явного возврата 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.И в этих языках этот «трюк» используется специально для достижения определенных эффектов.Поэтому для людей (более) знакомых с этими языками, может быть не очевидно (без документации или контекста), что должен быть возвращен только логический тип.

2 голосов
/ 04 февраля 2011

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

return (bool)$var;
0 голосов
/ 04 февраля 2011

Вы можете привести:

if ((bool)$string)

http://php.net/manual/en/language.types.type-juggling.php

Обратите внимание, что в PHP, поскольку 0 == false, вам нужно использовать компаратор === для получения сравнения типов, плюсСравнение значений.

http://php.net/manual/en/language.operators.comparison.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...