Я работаю с декодированным 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?
Вариант 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
$data = json_decode($json,true);if (array_key_exists('var', $data)) {...
new Foo() {{a=1; b=2;}}
более читабелен или понятен, чемnew Foo(1,2);
, Для более сложных случаев, связанных с инициализацией неизменяемых классов, Builders также очень легко читать и понимать, и они облегчают использование необязательных параметров.