Определить существует ли переменная

Вурдалак

Продвинутый новичок
чему вы удивляетесь, обычный рефакторинг для уменьшения вложенности
PHP:
if ($_GET['id']) {
     $item = $db->getItemById($_GET['id']);
     // вся цепочка ифов могла бы быть здесь, но когда вложенность ифов 3-4 читается отвратно.
}
if (isset($item) && $item) {
} elseif (isset($item)) {
} else {
}
Фуу, это типа читается лучше? :confused:
 

AmdY

Пью пиво
Команда форума
Вурдалак
прояви абстрактное мышление, добавь кода и увеличь вложенность до 3-4 ифов как в написано в комментарии к коду. мне сложно найти у себя конкретный пример, но такое попадается изредко.
 

Вурдалак

Продвинутый новичок
Можно выделить в отдельный метод что-то в крайний случай. Надо смотреть конкретный пример. Но писать
PHP:
if( ... )
{
    $item = ...
}

if( isset($item) )
{
    // ...
}
я никогда себе не позволю.
 

Pascal9x

Новичок
Духовность™ написал(а):
PHP <> Pascal
может ты просто что-то не так делаешь? зачем вообще нужно определить существует-ли переменная?
Спасибо кэп. Делаю всё правильно, но если бы функция isset работала по нормальному - это бы украсило мой код. Решил проблему функцией array_key_exists, хотя обычно я делаю такую проверку с помощью isset().

Духовность™ написал(а):
Очень интересно посмотреть, зачем тов-щу Pascal9x понадобилось вообще делать такую проверку....
примеров можно придумать большое множество и на каждый из них будет обходное решение. В принципе можно вообще половину пхп выпилить и пользоваться дедовскими методами программирования. Мне хотелось сделать код читабельнее, и поэтому я создал эту тему.
 

craz

Нестандартное звание
array_key_exist - такая фигатень буэ... если ее применять к переменной пряма вот не что пахнуть будет гавнокодом, а прям вот костыль даже на вид..
 

Духовность™

Продвинутый новичок
Спасибо кэп. Делаю всё правильно, но если бы функция isset работала по нормальному - это бы украсило мой код.
функция isset работает правильно
может ты все же соизволишь привести пример своего кода, когда тебе понадобилось "определить существует-ли переменная"
 
  • Like
Реакции: craz

Pascal9x

Новичок
Я понимаю, что она работает так как задокументированно. Но всёже можно было сделать эту функцию лучше.

PHP:
function spool_write_multi($commands)
 {
 global $res;
 if (!is_array($commands)) return false;
 $result = array();
 db_query('SELECT count(*) FROM nx_spool', true);
 $spoolsize = intval(mysql_result($res, 0));
 $swapsize = $swapsize_old = intval(runvar('swapsize'));
 $dattim = SCRIPT_START;
 $q_swap = array();
 $q_spool = array();
 $online = false;

 foreach ($commands as $k=>$v)
  {
  //if (!isset($v['uid'], $v['cmd'], $v['send'], $v['params'])) {$result[$k]=false; continue;} //хотелось бы чтобы было так
  if (!isset($v['uid'], $v['cmd'], $v['send']) or !array_key_exists('params', $v)) {$result[$k]=false; continue;}
  $uid = intval($v['uid']);
  $cmd = strval($v['cmd']);
  $send = intval($v['send']) ? 1 : 0;
  if ($uid<0 or !chklen($cmd, 1, 50)) {$result[$k]=false; continue;}
  $params = (!is_null($v['params']) and (is_array($v['params']) or !$send)) ? gzserialize($v['params']) : '';
  $paramsize = strlen($params);
  $cmd = mysql_escape_string($cmd);
  $params = mysql_escape_string($params);
  if ($uid>0) $recipients = array($uid);
  elseif (is_array($online)) $recipients = $online;
  else {$online=array_keys(get_sessions()); $recipients=$online;}

  foreach ($recipients as $recipient) if ($spoolsize>950 or $paramsize>2000)
    {$q_swap[]="(0, $recipient, $send, $dattim, '$cmd', '$params')"; $swapsize++;}
  else
    {$q_spool[]="(0, $recipient, $send, $dattim, '$cmd', '$params')"; $spoolsize++;}
  $result[$k] = true;
  }

 if ($q_swap) db_query('INSERT INTO nx_swap VALUES ' . implode(',', $q_swap));
 if ($q_spool) db_query('INSERT INTO nx_spool VALUES ' . implode(',', $q_spool));
 if ($swapsize<>$swapsize_old) runvar('swapsize', $swapsize);
 return $result;
 }
Пожалуйста.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
а ТСу никто так и не ответил ;(

Pascal9x, тут не все посты надо читать, не ото всех участников

NULL - значение, получаемое из базы при отсутствии в ней данных. Это значение используется, вопрос имеет смысл и ответ на него - меняй стиль кодинга.

PHP уходит от процедурного стиля, глобальные скалярные переменные - плохо. Все данные оборачиваем или в объекты или в массивы.
У объекта ожидаемое поле должно быть всегда, а проверка наличия элемента массива - через array_key_exists().
!isset($v['uid'] --> !array_key_exists('uid',$v)

Для локальных функций/методов есть правило:
функция и метод не должны быть длиннее 100 строк и все локальные переменные в ней должны быть инициализированы перед использованием.
т.е. их всегда можно проверить на ===null

isset работает правильно, хочешь писать на php - прими его дао :)
 

Вурдалак

Продвинутый новичок
а проверка наличия элемента массива - через array_key_exists().
!isset($v['uid'] --> !array_key_exists('uid',$v)
Проверка наличия элемента — isset (NULL — отсутствие значения http://ru2.php.net/manual/en/language.types.null.php), ключа — array_key_exists. Проверять наличие ключа (а точнее, завязывать логику приложения на наличии ключа) глупо, поэтому только isset.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Проверять наличие ключа (а точнее, завязывать логику приложения на наличии ключа) глупо, поэтому только isset.
в чем именно глупость?
PDO работает с NULL, т.е. в базу запишется null, если параметру байндить null
 

Вурдалак

Продвинутый новичок
В том, что по-хорошему не должно быть различие между ключами, которым соответствует NULL и отсутствующими ключами. В противном случае возникает подозрение, что ключи используются как ещё один массив (вернее, set, множество: можно проверять существует или нет). Предназначение же ключей не в этом.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
для меня различие в том, что при обращении к отсутствующему ключу будет Notice,
и чтобы его не было я проверяю наличие полей перед обращением

ну, раньше делал. последнее время перешел на ActiveRecord с магией, там подобных вопросов нет вообще
 

Вурдалак

Продвинутый новичок
для меня различие в том, что при обращении к отсутствующему ключу будет Notice
— вот! Было бы хорошо, если бы вместо Notice возвращался бы NULL (он и возвращается, BTW, просто не считать это ошибкой). Возможно ли это на данном этапе развития PHP — точно не знаю... Вроде бы ничего не мешает сделать или я ошибаюсь?
 

Вурдалак

Продвинутый новичок
grigori, хватит троллить, я не вижу смысла в array_key_exists(), попробуй привести пример где он реально нужен. :)
 

craz

Нестандартное звание
$swapsize = $swapsize_old = intval(runvar('swapsize'));
я всегда думал что это так ради того чтобы было...
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
— а где там проверяется наличие ключа?
у меня :) и кидает notice, если проверки не будет

Было бы хорошо, если бы ... Возможно ли это на данном этапе развития ...
ты это серьезно? Аллах велик, а Магомет - пророк его?
забей, все будет так, как есть
 
Сверху