Как выполнить условие, если переменная не существует в скрипте

korpus

злой бобёр
Как выполнить условие, если переменная не существует в скрипте

Допустим, в какой-то части скрипта мы не знаем, существует ли переменная или нет. Если она не существует (никогда не было $a=...), то мы хотим выполнить некоторые условия. Используется версия php 5.2.4

Код:
<?php
ini_set('display_errors', '1');
ini_set('error_reporting', E_ALL | E_STRICT);
$a=TRUE;

// До этого момента мы не знаем значение переменой $a. Она может быть даже не установлена ( unset($a) ).
// В зависимости от того, есть она или нет, требуется выполнить какие-то операции

// unset($a); переменной может не существовать вовсе

if (isset($a) 
    OR $a===NULL)
{
   // операции здесь выполнятся только если переменная $a установлена или равна NULL (а также TRUE или FALSE)
   echo 'переменная существует!';
}
else
{
   echo 'переменная не инициализированна';
}

?>
Но если переменная $a в начале скрипта будет уничтожена unset($a), то при уровне вывода ошибок E_ALL | E_STRICT php выдаст ошибку "Обращение к несуществующей переменной".
Notice: Undefined variable: a in Z:\home\localhost\www\1.php on line 10
Т.е. скрипт работает некорректно и в случае чего будет выводить в браузер сообщения об ошибке.

Возникает вопрос, есть ли функция, позволяющая возвращать TRUE, если переменная $a равна NULL и FALSE, если такая переменная не существует вовсе?
is_null здесь также не подходит, т.к. если будет unset($a), то is_null($a) опять вызовет ошибку :)
 

craz

Нестандартное звание
unset($a);
if (isset($a)
OR @$a===NULL){
{
// операции здесь выполнятся только если переменная $a установлена или равна NULL (а также TRUE или FALSE)
echo 'переменная существует!';
}
else
{
echo 'переменная не инициализированна';
}
так без ошибки выдает что переменная существует, это нормально?
 

korpus

злой бобёр
Да в общем-то нормально =)

А если забудут убрать строгий уровень ошибок? Или при тестировании скрипта такие предупреждения будут в браузер вылазить? Это, на мой взгляд, не очень правильно, так как лично я считаю хорошим тоном отлаживать скрипт при самом высоком уровне ошибок, а в работу уже запускать без E_ALL | E_STRING.

По другому данный вопрос можно сформулировать так: какая функция определяет, выделено ли под данную переменную память в скрипте или нет. Если $a=NULL, то наверное, под переменную $a выделена память.
 

craz

Нестандартное звание
Автор оригинала: korpus
какая функция определяет, выделено ли под данную переменную память в скрипте или нет
у меня я такая функция)
unset($a);
if (isset($a)
OR @$a===NULL){
{
// операции здесь выполнятся только если переменная $a установлена или равна NULL (а также TRUE или FALSE)
echo 'переменная существует!';
}
else
{
echo 'переменная не инициализированна';
}
так без ошибки выдает что переменная существует, это нормально?


точно нормально?
 

dr-sm

Новичок
E_STRICT

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

Фанат

oncle terrible
Команда форума
а в работу уже запускать без E_ALL | E_STRING.
что за глупость?
а как потом ошибки искать?

вообще непонятно отношение к ошибкам. Если при тестировании скрипта такие предупреждения будут в браузер вылазить - это прекрасно! Ради этого мы его и тестируем. Разве нет?
 

craz

Нестандартное звание
Это я вот к примеру считаю восхитительно))
 

Single

пилот капсулы
ну как правило ошибки ищутся наличием двух работоспособных копий системы, дев версия где можно и нужно отслеживать все ошибки включая нотисы, на продакшен уже и "E_ALL | E_STRING" можно поставить.
 

dr-sm

Новичок
на продакшене просто надо писать логи ане вываливать на экран.
 

Фанат

oncle terrible
Команда форума
Single
две копии иметь невозможно.
если на продакшене отвалилась база, то пользы от твоей копии?

-~{}~ 10.03.10 17:36:

STRING вообще да, жжот.
 

Single

пилот капсулы
если на продакшене отвалилась база
ну мне кажется не очень правильным использовать для двух серверов одну БД, как минимум отдельная БД для дева нужна для проведения работ по оптимизации запросов, моделирования каких то не стандартных тестов системы.
 

korpus

злой бобёр
Автор оригинала: *****
что за глупость?
а как потом ошибки искать?

вообще непонятно отношение к ошибкам. Если при тестировании скрипта такие предупреждения будут в браузер вылазить - это прекрасно! Ради этого мы его и тестируем. Разве нет?
:) Интересное отношение к веб-программированию. В готовых работоспособных сайтах предупреждения должны быть выключены.

В основном были предложены всякие выкрутасы, чтобы решить проблему. @ в частности это по-моему выкрутас, но решение работоспособное как видно.

Вообще isset() ведёт себя странно, выдавая FALSE, если переменная равна NULL. По мне не очень хорошее поведение.

-~{}~ 10.03.10 19:04:

2 craz Сначала не заметил @ в твоём первом сообщении, думал там просто E_ALL } E_STRICT нету

-~{}~ 10.03.10 19:08:

2 *****
Точно! E_ALL | E_STRICT. Чушь была написана.

-~{}~ 10.03.10 19:11:

Автор оригинала: dr-sm
E_STRICT

PS переменная существует не в скрипте, а в области видимости.
если ты используешь переменную, то ты должен точно знать,
что она в данной области видимости определена, иначе получается говнокод типа register_globals.
используй массив.
Может быть такая ситуация:

Код:
  if (isset($_GET['a'])) $a=$_GET['a'];
  else 
 { 
 // здесь переменная не создаётся 
 }
 

fixxxer

К.О.
Партнер клуба
Если тебе надо отличать isset от is_null, то что-то не так с архитектурой. А так это известная проблема, в целом - по нормальному отличить никак
 

С.

Продвинутый новичок
на продакшене просто надо писать логи ане вываливать на экран.
Да уж пусть лучше посетитель видит, что какой-то сбой произошел, а не получал молчком кривую страницу и чесал репу: что не так, и кто дурак, он или девелопер?
 

dimagolov

Новичок
С., пользователю нужно отдавать страницу с сообщением об ошибке (например через 302 код), а не ошибки PHP, через которые еще и можно подставиться под атаку.
 

dr-sm

Новичок
Автор оригинала: korpus
Может быть такая ситуация:
PHP:
// предположим что здесь $a неопределено.
if (isset($_GET['a'])) {
  $a = $_GET['a'];
} else  { 
 // здесь переменная не создаётся 
}

// несколькими экранами кода ниже:
if (isset($a)) {
  echo 'Лютый говнокод, так нельзя делать';
}
может быть да, ну и что, поясни плс на примере зачем еще тебе функция проверяющая существование $a.

2 С.: лучше пусть админ увидит в логах, что что-то не то происходит,
чем это увидит пользователь, и в лучшем случае пришлет админу.
 

Фанат

oncle terrible
Команда форума
Single
ты в состоянии следить за ходом дискуссии целиком? Или у тебя в голове толко одно сообщение помещается?

еще раз. КАК тебе отладочная копия поможет поймать ошибку соединения с базой на продакшене?
Что вообще за детсадовское отношение к коду, как будто ошибки могут происходить толко при разработке?

С.
korpus
Вам, дети, читать фак http://phpfaq.ru/debug2
 

korpus

злой бобёр
Автор оригинала: *****
С.
korpus
Вам, дети, читать фак http://phpfaq.ru/debug2
Вот практически с чтения этой страницы я и дошёл до такой коллизии

-~{}~ 11.03.10 18:31:

2 dr-sm Когда переменные передаются скрипту через $_GET, такая ситуация может возникнуть. Я ищу нормальное универсально решение без багов.

Вопрос думаю можно закрыть, если в начале поставить такое:
$a=isset($a)?$a:NULL;
А дальше уже делать проверку будучи уверенным, что $a обязательно существует.
 
Сверху