Проверить, не определена ли переменная is_undefined в PHP

В PHP я хочу проверить, не была ли переменная установлена ​​/ определена, где установка переменной NULL считается установленной / определенной.

Я здесь все в курсе: http://php.net/manual/en/types.comparisons.php включая isset (), empty () и is_null (). Мне кажется, что это не то, что я ищу. Рассмотрим следующий пример:

<?php 
$myNull = null;
echo 'isset($myNull): "'.isset($myNull).'"<br />';
echo '$myNull value = "'.$myNull . '"<br />';

echo "<br />";

echo 'isset($myUndefined): "'.isset($myUndefined).'"<br />';
echo '$myUndefined value = "'.$myUndefined . '"<br />';
?>

В этом примере выводится что-то вроде:
isset ($ myNull): ""
$ myNull value = ""

isset ($ myUndefined): ""
Примечание: Неопределенная переменная: myUndefined в C: \ wamp \ www \ plm \ temp4.php в строке 9
$ myUndefined value = " "

Я хочу знать, является ли переменная неопределенной, как указано выше в уведомлении. Мне нужна функция, назовите ее is_undefined, где

$myNull = null;
is_undefined($myNull); // is false
is_undefined($myUndefined); // is true

Кто-нибудь? Заранее спасибо.


person tjbourke    schedule 07.06.2013    source источник


Ответы (7)


Я еще не использовал его, но думаю, что "get_defined_vars" стоит посмотреть ... http://php.net/manual/en/function.get-defined-vars.php

Я бы попробовал и сбросил результат.

person cljk    schedule 07.06.2013
comment
Кроме того, если вы находитесь в глобальной области видимости, вы можете проверить, есть ли array_key_exists в $ GLOBALS. - person Jonathan Kuhn; 08.06.2013
comment
Я сомневался, что есть какое-то решение. Это прекрасно работает, спасибо! Я использовал его вместе с array_key_exists ($ key, $ array). - person tjbourke; 10.06.2013

Я думаю, что get_defined_vars - хороший кандидат на такую ​​работу:

array_key_exists('myNull', get_defined_vars());

Должен делать то, что вы ожидаете.

Если вы работаете с глобальным контекстом, вы также можете использовать:

array_key_exists('myNull', $GLOBALS);
person Alain Tiemblo    schedule 07.06.2013

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

function is_undefined(&$test) {
    return isset($test) && !is_null($test);
}

Поэтому, когда вы echo isset($myNull);, он преобразует логическое (истинное) значение в "". вот почему значение пустое. Если вы хотите увидеть это на экране, вы можете сделать var_dump(isset($myNull));, который отобразит, истинно это или нет.

Также у вас есть эхо $ myUndefined, но оно еще не установлено, поэтому вы получаете предупреждение. Что вы хотите сделать:

if (!empty($myUndefined)) {
    // variable is defined so do something with it
    echo '$myUndefined value = "' . $myUndefined . '"<br />';
} else {
    echo 'Oops, $myUndefined is Undefined!<br />";
}

Вот краткий обзор isset () vs. is_null () vs. empty ()

$foo = null;
// isset($foo) == true;
// empty($foo) == true;
// is_null($foo) == true;

// Notice I don't set $foo2 to anything
// isset($foo2) == false;
// empty($foo2) == true;
// is_null($foo2) throws a notice!

$foo3 = false;
// isset($foo2) == true;
// empty($foo2) == true;
// is_null($foo2) == false;

$foo4 = 1234;
// isset($foo2) == true;
// empty($foo2) == false;
// is_null($foo2) == false;
person chrislondon    schedule 07.06.2013
comment
is_null() вызовет E_NOTICE, если переменная не определена. - person Voitcus; 08.06.2013
comment
empty() возвращает true, если это определенная NULL переменная :) - person Voitcus; 08.06.2013
comment
Я знаю, что это ОКР, но ваша заключительная цитата во второй строке должна быть ', а не _2 _... красная точка с запятой и закрывающая скобка сводят меня с ума, и я не могу изменить это, потому что это редактирование одного символа. - person Jason Nichols; 08.06.2013
comment
Ха-ха @JasonNichols Я отредактировал свой пост примерно за 30 секунд до того, как вы прокомментировали. Я тоже это ненавижу! - person chrislondon; 08.06.2013
comment
@GGio, использующий empty() для неустановленной переменной, НЕ уведомит вас. Поверьте, я проверил;) - person chrislondon; 08.06.2013
comment
@GGio весь мой код: <?php error_reporting(E_ALL); empty($test); Результат? Никаких уведомлений! Значит, вы либо неправильно понимаете php.net, либо на их сайте есть опечатка. Поверьте мне. Попробуй сам - person chrislondon; 08.06.2013
comment
@GGio ... ха-ха ... ой? я прав? хе-хе удали свои комментарии, чтобы не выглядеть глупо :) - person chrislondon; 08.06.2013
comment
+1 Очень хорошее решение, в котором вы можете использовать реальную переменную, а не просто имя в виде строки (решения get_defined_vars() ...). - person jeroen; 08.06.2013
comment
Вы упустили суть @chrislondon, и вы не очень хорошо прочитали мой пост. Я сказал, что понимаю все эти функции, и ни одна из них не работает. Я сказал, что is_undefined () должна возвращать false, если установлено NULL, и true, если никогда не было установлено. Простой тест покажет, что ваша функция возвращает false и false. - person tjbourke; 10.06.2013
comment
Эта реализация is_undefined неправильно возвращает false для переменных, для которых установлено значение null, и дает точные те же результаты, что и isset для определенных, неопределенных и переменных, для которых установлено значение null. Часть && !is_null($test) полностью избыточна. - person Ultimater; 06.10.2013

Для этого также можно использовать compact(), если указанная вами переменная не в таблице символов он возвращает пустой массив, в противном случае массив, содержащий пару имя / значение переменной, просто приведите результат к логическому

<?php

$myNull = null;

$isDefined = (bool) compact('myNull'); // true

$otherIsDefined = (bool) compact('myUndefined'); // false 
person Crisp    schedule 07.06.2013

Если вы используете ООП, используйте перегрузку __isset(), эта функция будет выполняться, когда вы пытаетесь получить доступ к переменной, которая нигде не определена. пример:

 public function __isset($name) {
    echo 'Hello';
 }

Таким образом, вы избежите любого сообщения об ошибке или уведомления, связанного с неопределенной переменной.

person GGio    schedule 07.06.2013
comment
Мне нравится эта идея, но будьте осторожны, потому что property_exists не вызовет ваш магический метод: это может в некотором смысле сбивать с толку. - person Alain Tiemblo; 08.06.2013
comment
Я использую ООП, но я хочу больше, чем просто убрать уведомление, я хочу проверить, установлена ​​ли переменная ($ asdf = something, или $ asdf = null, и т. Д.). Это может по-прежнему работать, но я предпочитаю функции get_defined_vars (). Спасибо, в любом случае. - person tjbourke; 10.06.2013

Да, как и г-н Джонатан, упомянутый выше, мы могли бы использовать array_key_exists () + $ GLOBALS, а не get_defined_vars (), чтобы идентифицировать переменную Undefined как null

$x;  // $x is undefined 
$y=null;  // $y is defined and is NULL type variable with the only null value
$z=[];    // $z is an array object

if( array_key_exists('x', $GLOBALS) && is_null($x) ) echo "\$x exists and is null\n";
if( array_key_exists('y', $GLOBALS) && is_null($y) ) echo "\$y exists and is null\n";
if( array_key_exists('z', $GLOBALS) && is_null($z) ) echo "\$he exists and is null\n";

// output 
$y exists and is null
person John Yin    schedule 30.12.2013

Чтобы проверить, что переменная определена и имеет какое-то значение, мы можем использовать isset() в условии

if(!isset($var)){}
person Muhammad Bilal    schedule 02.02.2021