我有一个Stripe订阅对象,看起来像这样......
subscription: {
items: {
data: [
plan: {
id: 'my_plan_id'
}
]
}
}
安全检索计划ID的最佳方法是什么?目前我正在做以下事情。
'plan_id' => $subscription->items->data[0]->plan->id,
但是,如果未设置items
,data[0]
或plan
,则看起来会失败。我可以在if if (isset($subscription->items) && isset(data[0]) ...
之类的语句中进行嵌套,但我不确定这是最好的方法。
我是否可以使用PHP方法或Laravel方法安全地提取该属性,哪个更干净?
答案 0 :(得分:5)
如果您使用的是PHP 7+,则可以使用null coalesce运算符:
'plan_id' => $subscription->items->data[0]->plan->id ?? $default,
这将评估值是否可用,否则将使用默认值,而不会产生任何警告或错误。
示例:
$foo = new stdClass();
var_dump($foo->bar->baz->data[0]->plan->id ?? null);
输出:
NULL
答案 1 :(得分:4)
您可以在整个选择器上使用isset
功能:
isset($subscription->items->data[0]->plan->id) ? $subscription->items->data[0]->plan->id : null;
答案 2 :(得分:1)
在 PHP 8 版
您应该按如下方式使用 Nullsafe 运算符:
<块引用>'plan_id' => $subscription?->items?->data[0]?->plan->id,
答案 3 :(得分:0)
通过键列表访问嵌套结构的相当繁琐但通用的方法;可以很容易地成为一个可重用的功能:
$id = array_reduce(['items', 'data', 0, 'plan', 'id'], function ($o, $k) {
if (!$o) {
return null;
} else if (is_array($o) && isset($o[$k])) {
return $o[$k];
} else if (isset($o->$k)) {
return $o->$k;
}
}, $subscription);
答案 4 :(得分:0)
您可以获取ternary condition
的帮助来检查值是否已设置。如果设置则输入该值,否则将默认设置为
$id=isset($subscription->items->data[0]->plan->id) ? $subscription->items->data[0]->plan->id : $your_dafault_value;
如果设置了值,则$id
看起来像
$id='my_plan_id';//In most cases we should consider null as a default value
如果未设置该值,则$id
看起来像是
$id='your_dafault_value';