Передача неустановленных переменных в функции - PullRequest
4 голосов
/ 05 апреля 2011

Мой код:

function Check($Variable, $DefaultValue) {
    if(isset($Variable) && $Variable != "" && $Variable != NULL) {
        return $Variable;
    }
    else {
        return $DefaultValue;
    }
}

$a = Check(@$foo, false);
$b = Check(@$bar, "Hello");

//$a now equals false because $foo was not set.
//$b now equals "Hello" because $bar was not set.
  1. Когда переменная не существует и передается функции (подавляя ошибку), что на самом деле передается?
  2. Есть ли какое-либо неопределенное поведение, которое эта функция может демонстрировать?
  3. Есть ли лучший способ обернуть тестирование на наличие переменных и предоставить значение по умолчанию из функции?
  4. Что проверяет isset() под капотом при тестировании переменной?

EDIT:

Значение по умолчанию определяется пользователем. Иногда это будет число, иногда строка.

Ответы [ 4 ]

8 голосов
/ 05 апреля 2011
  1. Пропуск NULL, ошибка уведомления.
  2. Нет, функция видит только свои параметры (ей все равно, как она вызывается)
  3. Вы можете легко указать значение по умолчанию - функция func ($ обязательный, $ необязательный = 'значение по умолчанию');
  4. Исеть в функции с ее параметрами бессмысленно, потому что параметры уже установлены в сигнатуре функции.
2 голосов
/ 21 апреля 2018

Вы можете передать переменную методу по ссылке, поставив перед ним знак & при объявлении функции.Тогда вы можете просто проверить, установлен ли он внутри функции, и не беспокоиться о подавлении предупреждений при передаче значения, которое не установлено.

function Check(&$Variable, $DefaultValue) {
    if(isset($Variable) && $Variable != "" && $Variable != NULL) {
        return $Variable;
    }
    else {
        return $DefaultValue;
    }
}

$a = Check($foo, false);
$b = Check($bar, "Hello");
2 голосов
/ 05 апреля 2011

Когда переменная не существует и передается функции (подавляя ошибку), что на самом деле передается?

В этом случае вы пытаетесь читать из не-существующая переменная
Итак, вы получаете null - который передается в функцию.


Есть ли какое-либо неопределенное поведение, которое эта функция может демонстрировать?

Не то, что я вижу - кроме использования оператора @ не очень хорошая практика.

2 голосов
/ 05 апреля 2011
  1. null будет передано
  2. В PHP нет неопределенного поведения AFAIK
  3. Обычно тестирование проводится с empty($var), например: Check(empty($foo) ? null : $foo), хотя в зависимости от обстоятельств isset может быть более подходящим
  4. То, что делает isset, точно задокументировано - он проверяет, существует ли такая переменная в области видимости, и ее значение не идентично null
...