Проверить значение NULL в переменной, которая не может быть установлена

Учитывая, что:

  • Конструкция isset () возвращает TRUE, если задана переменная, а не NULL
  • Функция is_null () выдает предупреждение, если переменная не задана

Есть ли способ проверить, существует ли переменная, независимо от того, является ли она 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'); ?> 

Related of "Проверить значение 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"; } 

Это должно сделать трюк.