Учитывая, что:
Есть ли способ проверить, существует ли переменная, независимо от того, является ли она NULL или нет, без использования оператора @ для подавления уведомления?
РЕДАКТИРОВАТЬ
Вместе с вашими первыми ответами я об этом думал, и я получаю заключение, что проверка get_defined_vars () – единственный способ отличить переменную, установленную с NULL и неустановленной переменной. PHP, похоже, делает небольшие различия:
<?php $exists_and_is_null = NULL; // All these are TRUE @var_dump(is_null($exists_and_is_null)); @var_dump(is_null($does_not_exist)); @var_dump($exists_and_is_null===NULL); @var_dump($does_not_exist===NULL); @var_dump(gettype($exists_and_is_null)=='NULL'); @var_dump(gettype($does_not_exist)=='NULL'); ?>
$result = array_key_exists('varname', get_defined_vars());
Как вы уже выяснили, вы не можете:
isset
, так как он возвращает false
для переменной null
. $not_exists===null
, так как оно поднимет уведомление. Но вы могли бы использовать комбинацию:
get_defined_vars
чтобы получить список существующих переменных, включая те, которые являются null
, array_key_exists
чтобы узнать, существует ли запись в этом списке. Например :
$exists_and_null = null; $exists_and_not_null = 10; $defined_vars = get_defined_vars(); // true var_dump(array_key_exists('exists_and_null', $defined_vars) && $defined_vars['exists_and_null']===null); // false var_dump(array_key_exists('exists_and_not_null', $defined_vars) && $defined_vars['exists_and_not_null']===null); // false var_dump(array_key_exists('not_exists', $defined_vars) && $defined_vars['not_exists']===null);
Несколько примечаний:
get_defined_vars
, поэтому выполняется вторая часть условия
true
true
, а вторая false
, false
. false
, Но обратите внимание, что это, вероятно, не очень хорошая идея, если вы заботитесь о производительности: isset
– это языковая конструкция, и она быстро – при вызове get_defined_vars
, вероятно, намного медленнее ^^
Я бы сказал, что любой код, требующий такого сравнения, неправильно воспринял бы его семантику; NULL – это неустановленное значение на языке, который не имеет прямого способа разграничения между ними.
Я использовал функцию, созданную самостоятельно, чтобы ее легко проверить, помните, что она сработает с предупреждением PHP (я только отслеживаю E_ERROR при разработке).
function isNullOrEmpty( $arg ) { if ( !is_array( $arg ) ) { $arg = array( $arg ); } foreach ( $arg as $key => $value ) { if( $value == null || trim($value) == "" ) { return true; } } return false; }
if (isset($var) && (is_null($var)) { print "\$var is null"; }
Это должно сделать трюк.