Какова лучшая практика PHP для использования функций, которые возвращают true или false? - PullRequest
5 голосов
/ 10 марта 2012

После игры с PHP я обнаружил, что true возвращается как 1, а false как null.

echo (5 == 5) // displays 1
echo (5 == 4) // displays nothing

При написании функций, которые возвращают true или false, каковы наилучшие методы их использования?

Например,

function IsValidInput($input) {
  if ($input...) {
    return true;
  }
  else {
    return false;
  }
}

Это лучший способ использования функции?

if (IsValidInput($input)) {
  ...
}

Как бы вы написали противоположную функцию?

IsBadInput($input) {
  return ! IsValidInput($input);
}

Когда бы вы использовали оператор ===?

Ответы [ 5 ]

4 голосов
/ 10 марта 2012

После игры с PHP я обнаружил, что true возвращается как 1, а false как ноль.

Это не правда (не каламбур).PHP, как и многие другие языки, имеет «истинные» и «ложные» значения, которые могут вести себя как TRUE или FALSE по сравнению с другими значениями.

Это так, потому что PHP использует слабую типизацию (против строгая типизация ).Он автоматически преобразует различные типы значений при сравнении, поэтому в конечном итоге может сравнивать два значения одного типа.Когда вы echo TRUE; в PHP, echo всегда будет выводить строку.Но вы передали ему логическое значение, которое должно быть преобразовано в строку, прежде чем echo сможет выполнить свою работу.Таким образом, TRUE автоматически преобразуется в строку "1", а FALSE преобразуется в "".

Когда вы используете оператор ===?

Эта слабая или слабая типизация является причиной того, что PHP использует два оператора равенства, == и ===.Вы используете ===, когда хотите убедиться, что оба сравниваемых значения не просто «равны» (или эквивалентны), но также имеют одинаковый тип.На практике:

echo 1 == TRUE; // echoes "1", because the number 1 is a truthy value
echo 1 === TRUE; // echoes "", because 1 and TRUE are not the same type (integer and boolean)

При написании функций, которые возвращают true или false, каковы наилучшие практики для их использования?

Будьте точны, когда можете возвращатьфактический логический TRUE или FALSE.Типичные случаи - это функции с префиксом is, например isValidInput.Обычно ожидается, что такие функции будут возвращать либо TRUE, либо FALSE.

С другой стороны, полезно, чтобы ваша функция в некоторых случаях возвращала «ложные» или «правдивые» значения.Возьмите, например, strpos.Если он находит подстроку в нулевой позиции, он возвращает 0 (int), но если строка не найдена, он возвращает FALSE (bool).Итак:

$text = "The book is on the table";
echo (strpos($text, "The") == FALSE) ? "Not found" : "Found"; // echoes "Not found"
echo (strpos($text, "The") === FALSE) ? "Not found" : "Found"; // echoes "Found"
2 голосов
/ 10 марта 2012
function isValidInput($input){
    return ($input ...);   // if your test returns true/false, just return that result
}

В вашем последнем примере отсутствует аргумент, в противном случае все в порядке:

function isBadInput($input){
    return !isValidInput($input);
}
1 голос
/ 10 марта 2012

После игры с PHP я обнаружил, что true возвращается как 1, а false как ноль.

No .. true и false возвращаются как логические trueи false. Когда вы выводите эхо-сигнал , он должен быть приведен к строке для отображения.Как согласно инструкции :

Логическое значение TRUE преобразуется в строку "1".Логическое значение FALSE преобразуется в "" (пустая строка).Это позволяет выполнять преобразование между логическим и строковым значением туда и обратно.

В остальном: хорошо, да, да, когда вы хотите точные совпадения типов, чтобы избежать жонглирования типов в сравнениях, например "1" == true верно, но "1" === true неверно.

1 голос
/ 10 марта 2012
  1. Конечно. Если вам это не нужно в другой структуре, например, цикл while.

  2. Ты бы никогда не стал. Всегда инвертируйте обычную функцию напрямую.

  3. Когда вам нужно дифференцировать false от 0, '' и т. Д.

0 голосов
/ 10 марта 2012
function isValidInput($input) {
  return ($input...);
}

if(isValidInput($input))
  ...

if(!isValidInput($input)) // never rewrite inverse functions
  ...

if(isValidInput($input) === false) {
  // Only run if the function returned a boolean value `false`
  // Does the same thing as above, but with strict typing.
}
...