Это правильный способ вернуть значение в PHP

У меня очень простой вопрос относительно возвращаемого значения функции и проверки значения переменной.

function test($var1, $var2){
    if ($var1 == $var2){
            $var3 = "abc";
            return $var3;
        }
    return false
}

$value = test($var1, $var2);

if ($value){
    echo "Value is".$value;  //should output abc.
} else {
    echo "Not equal";
}
  1. Можно ли вернуть значение или вернуть false? Например, я не возвращаю TRUE, это нормально?

  2. Когда я вызываю функцию, я сохраняю возвращаемое значение в переменной $value. Как я могу проверить, что функция вернула $var3? Какое из условий if следует использовать? if (!empty($value)) или if (isset($value)) или if ($value) или if (value != false)


person sunjie    schedule 20.06.2011    source источник
comment
$var3 = "abc"; return $var3; должно быть return "abc";   -  person ThiefMaster    schedule 20.06.2011
comment
Я предлагаю взглянуть на такие функции, как strpos: php.net/manual/en/function .strpos.php   -  person Felix Kling    schedule 20.06.2011


Ответы (7)


Да, в PHP принято возвращать FALSE в качестве индикатора состояния ошибки. (Вы сами решаете, что представляет собой ошибка, и зависит от того, что должна делать функция.)

Однако, поскольку PHP автоматически приводит к логическому значению значения другого типа (например, пустую строку или 0, которые также оцениваются как FALSE), вы должны выполнить явную проверку для FALSE следующим образом:

if ($value !== FALSE) ...

Как отмечает в комментариях Феликс Клинг, это называется «строгим сравнением» (или «сравнением тождества»). Он проверяет, является ли значение идентичным FALSE, тогда как != FALSE, == FALSE и if ($value) только проверяют, может ли значение быть интерпретировано как FALSE.

person Tomalak    schedule 20.06.2011
comment
@Tomalak, а как насчет if ($value), будет ли это работать правильно, если функция возвращает ложное значение? - person sunjie; 20.06.2011
comment
@sunjie: Да, будет. Но с вашим собственным образцом функции вы могли бы сделать test("", ""). Это вернет "", но ваш if ($value) перейдет в ветку else (что неверно), а if ($value === FALSE) — нет. - person Tomalak; 20.06.2011
comment
Его функция возвращает abc, иначе то, что вы говорите, неверно. Проще просто придерживаться строгого сравнения и всегда использовать его... тогда код ясно показывает, что вы пытаетесь сделать. - person Karoly Horvath; 20.06.2011
comment
@yi_H: Да, но я предпочитаю явно проверять состояние ошибки (т. е. для FALSE), когда функция использует этот метод для указания на ошибку. - person Tomalak; 20.06.2011
comment
@Tomalak: нет никаких «но», это именно то, что я говорил. === и !== — так называемые операторы строгого сравнения. - person Karoly Horvath; 20.06.2011
comment
@yi_H Да, теперь я тебя понял. Непонимание с моей стороны, извините. :) - person Tomalak; 20.06.2011

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

When converting to boolean, the following values are considered FALSE:

* the boolean FALSE itself
* the integer 0 (zero)
* the float 0.0 (zero)
* the empty string, and the string "0"
* an array with zero elements
* an object with zero member variables (PHP 4 only)
* the special type NULL (including unset variables)
* SimpleXML objects created from empty tags

http://php.net/manual/en/language.types.boolean.php

person Jacob    schedule 20.06.2011

  1. Совершенно нормально возвращать разные типы данных.

  2. Если вы хотите проверить на ложь, используйте: if ($value !== false). Если вы запутались, какое условие использовать, это прояснит его: http://www.php.net/manual/en/types.comparisons.php

person Karoly Horvath    schedule 20.06.2011

Ваша функция возвращает false, поэтому я бы пошел с этой проверкой: if ($value != false)

person Tudor Constantin    schedule 20.06.2011
comment
Это не удастся. Попробуйте ("" != false). - person Tomalak; 20.06.2011
comment
В каком случае эта функция вернется? В любом случае, ваше наблюдение уместно, следует проверить, что тип данных также логичен с помощью !== - person Tudor Constantin; 20.06.2011

$var3 = "abc";
return $var3;

Это бессмысленно. Вы return используете значение, а не переменную. return "abc"; в полном порядке.

Можно ли вернуть значение или вернуть false?

Да, для такого простого случая, как этот, вполне нормально.

Как я могу проверить, что функция вернула $var3?

Как сказано выше, функция возвращает значение "abc", а не $var3. Вы сохраняете его в новой переменной $value. Эта переменная определенно установлена (вы только что создали ее прямо здесь), поэтому нет необходимости в isset или empty. Просто проверьте, равно ли его значение true или false (или что-то еще, что вы хотите проверить). Так что то, как вы это делаете, в порядке.

person deceze♦    schedule 20.06.2011

  1. Да, вы можете вернуть практически что угодно из функции, или вы можете просто «вернуться», ничего не возвращая. В вашем примере вы получите строку или «false» в ответ.

  2. Чтобы проверить на ложь, вы либо делаете if (!$variable), либо if ($variable===false). Ноль вернет true, если вы сделаете «if ($variable==false)» из-за автоматического приведения нуля к false (и любого другого положительного числа к true). Три "===" удостоверяются, что это действительно ложь и ничего больше. isset ($ var) проверяет существование, а не значение - и не применимо к вашему примеру, поскольку ваша функция вернет значение или «ложь» и, следовательно, всегда существует.

person Bing    schedule 20.06.2011
comment
Да, это то, что я пытался сказать, но я понимаю, что я был немного неясен. Спасибо. - person Bing; 20.06.2011

Единственный правильный ответ здесь: это зависит.

Я всегда задаю себе этот вопрос при создании такой функции. Чтобы ответить на него, я анализирую, что функция делает, а не то, что она возвращает.

Например, если у меня есть геттер, я ожидаю получить значение или ничего. В этом случае я часто возвращаю null, когда ничего не найдено/что-то пошло не так. На мой взгляд, тестовая функция, подобная вашей, должна всегда возвращать логическое значение. Я думаю, что возврат переменной, когда вы проверяете, является ли что-то истинным или ложным, семантически некорректен.

Помимо семантики: возврат 0, false или null не имеет большого значения, когда вы проверяете его с помощью if (test($var1, $var2)), поскольку все они будут работать одинаково. Однако, если вам нужны более тонкие детали, вам нужно выполнить проверку личности (===), а не проверку на равенство. В PHP это иногда имеет место, например, strpos может возвращать 0 или false, 0, являющееся совпадением, найдено, а false — нет. Поэтому следующее потерпит неудачу:

// returns 0, which is casted to false, so the 'else' part is executed
if (strpos('a', 'abc')) { 
    // 'abc' contains 'a'
} else {
    // 'abc' does not contain 'a'
}

Итак, вкратце: это зависит...

person Peter Kruithof    schedule 20.06.2011