Избегать уведомления в PHP при проверке, существуют ли данные

1

Я работаю с декодированным JSON, и я хочу проверить, существует ли поле.

Это то, что у меня есть:

$data = json_decode($json);
if(!$var = $data->{'var'})
    return false;
else
    return $var;

С помощью этого кода я получаю Notice: Undefined property: stdClass::$var in... Он работает, и я знаю, что могу избавиться от уведомлений, обратившись к error_reporting, но я предпочитаю не получать это уведомление, поэтому я сделал следующее:

$data = json_decode($json);
if(!isset($data->{'var'}))
    return false;
else {
    $var = $data->{'var'};
    return $var;
}

В этом случае я не получаю уведомление, но я должен сначала проверить, существует ли isset а затем создать переменную, содержащую эти данные, что не кажется приятным. Я пытался:

$data = json_decode($json);
if(!isset($var = $data->{'var'}))
    return false;
else {
    return $var;
}

Но затем я получаю синтаксическую ошибку (syntax error, unexpected '=', expecting ',' or ')'). Итак, есть ли правильный способ сделать это в PHP? Или я должен просто забыть об этом и продолжать с выбором № 2?

  • 0
    $data = json_decode($json,true);if (array_key_exists('var', $data)) {...
  • 0
    @DávidHorváth: DávidHorváth: я не думаю, что вы когда-нибудь заставите меня согласиться с тем, что new Foo() {{a=1; b=2;}} более читабелен или понятен, чем new Foo(1,2); , Для более сложных случаев, связанных с инициализацией неизменяемых классов, Builders также очень легко читать и понимать, и они облегчают использование необязательных параметров.
Показать ещё 5 комментариев
Теги:

1 ответ

2
Лучший ответ

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

Вы можете немного сократить его с помощью trernary:

$data = json_decode($json);
return isset($data->{'var'})? $data->{'var'} : false;

Если вам нужно выполнить несколько проверок, напишите абстракцию:

function tryGetObjectProperty($obj, $prop, $default = false){
    return isset($obj->{$prop})? $obj->{$prop} : $default;
}

$data = json_decode($json);

$var1 = tryGetObjectProperty($data, 'var');
var2  = tryGetObjectProperty($data, 'var2');
//etc

Ещё вопросы

Сообщество Overcoder
Наверх
Меню