如何安全地检索此对象的此属性?

时间:2017-06-30 13:59:43

标签: php laravel object properties

我有一个Stripe订阅对象,看起来像这样......

subscription: {
    items: {
        data: [
            plan: {
                id: 'my_plan_id'
            }
        ]
    }
}

安全检索计划ID的最佳方法是什么?目前我正在做以下事情。

'plan_id' => $subscription->items->data[0]->plan->id,

但是,如果未设置itemsdata[0]plan,则看起来会失败。我可以在if if (isset($subscription->items) && isset(data[0]) ...之类的语句中进行嵌套,但我不确定这是最好的方法。

我是否可以使用PHP方法或Laravel方法安全地提取该属性,哪个更干净?

5 个答案:

答案 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';