Согласно руководству по PHP для функции empty (): «Определите, считается ли переменная пустой. Переменная считается пустой, ЕСЛИ ЭТО НЕ СУЩЕСТВУЕТ, или если ее значение равно ЛОЖЬ. Empty () не генерирует предупреждение, если переменная не существует. " (Мой акцент.) Это означает, что функция empty () должна квалифицироваться как «лучший способ проверить существование переменной в PHP», согласно заголовку Question.
Однако этого недостаточно, потому что функция empty () может быть одурачена переменной, которая существует и имеет значение NULL.
Я прерываю свой предыдущий ответ, чтобы представить что-то лучше, потому что он менее громоздок, чем мой первоначальный ответ (который следует за этим прерыванием, для сравнения).
function undef($dnc) //do not care what we receive
{ $inf=ob_get_contents(); //get the content of the buffer
ob_end_clean(); //stop buffering outputs, and empty the buffer
if($inf>"") //if test associated with the call to this function had an output
{ if(false!==strpos($inf, "Undef"); //if the word "Undefined" was part of the output
return true; //tested variable is undefined
}
return false; //tested variable is not undefined
}
Две простые строки кода могут использовать вышеуказанную функцию, чтобы определить, является ли переменная неопределенной:
ob_start(); //pass all output messages (including errors) to a buffer
if(undef($testvar===null)) //in this case the variable being tested is $testvar
Вы можете следовать за этими двумя строками с помощью чего угодно, например, такого:
echo("variable is undefined");
else
echo("variable exists, holding some value");
Я хотел поместить вызов ob_start () и ($ testvar === null) внутри функции и просто передать переменную в функцию, но она не работает. Даже если вы попытаетесь использовать функцию «передать по ссылке» переменной в функцию, переменная BECOMES определится, и тогда функция никогда не сможет обнаружить, что она ранее была неопределенной. То, что здесь представлено, - это компромисс между тем, что я хотел сделать, и тем, что на самом деле работает.
Из предыдущего следует, что существует другой способ всегда избегать появления сообщения об ошибке «Неопределенная переменная». (Предполагается, что предотвращение такого сообщения - вот почему вы хотите проверить, является ли переменная неопределенной.)
function inst(&$v) { return; } //receive any variable passed by reference; instantiates the undefined
Просто вызовите эту функцию, прежде чем что-то делать с вашим $ testvar:
inst($testvar); //The function doesn't affect any value of any already-existing variable
Значение переменной, которая была недавно создана, конечно же, равно нулю!
(Прерывание заканчивается)
Итак, после некоторого изучения и экспериментов вот что-то гарантированно сработает:
function myHndlr($en, $es, $ef, $el)
{ global $er;
$er = (substr($es, 0, 18) == "Undefined variable");
return;
}
$er = false;
if(empty($testvar))
{ set_error_handler("myHndlr");
($testvar === null);
restore_error_handler();
}
if($er) // will be 1 (true) if the tested variable was not defined.
{ ; //do whatever you think is appropriate to the undefined variable
}
Объяснение: переменная $ er инициализируется значением по умолчанию "no error". «Функция-обработчик» определена. Если $ testvar (переменная, которую мы хотим знать независимо от того, является ли она неопределенной), проходит предварительный тест функции empty (), то мы проводим более тщательный тест. Мы вызываем функцию set_error_handler () для использования ранее определенной функции-обработчика. Затем мы делаем простое сравнение идентичности с использованием $ testvar, КОТОРОЕ ЕСЛИ НЕ ОПРЕДЕЛЕННОЕ БУДЕТ ИСПРАВИТЬ ОШИБКУ. Функция-обработчик фиксирует ошибку и специально проверяет, является ли причиной ошибки тот факт, что переменная не определена. Результат помещается в переменную информации об ошибках $ er, которую мы можем позже протестировать, чтобы сделать все, что захотим, в результате узнавая наверняка, был ли определен $ testvar. Поскольку нам нужна только функция-обработчик для этой ограниченной цели, мы восстанавливаем исходную функцию обработки ошибок. Функция myHndlr должна быть объявлена только один раз; другой код может быть скопирован в любое подходящее место для $ testvar или любой другой переменной, которую мы хотим проверить таким образом.