14

您好,我正在打这个电话:

$parts = $structure->parts;

现在 $structure 只有特殊情况下的部分,所以调用返回 null。这对我来说很好,我的代码后面有一个if($parts) {...} 。不幸的是,在代码完成运行后,我收到了这条消息:

注意:未定义的属性:stdClass::$parts in ...

如何抑制此消息?

谢谢!

4

5 回答 5

35

该功能isset应该完全满足您的需求。

PHP: isset - 手册

例子:

$parts = (isset($structure->parts) ? $structure->parts : false);
于 2012-04-13T14:59:59.527 回答
5

也许这个

$parts = isset($structure->parts) ? $structure->parts : false ;
于 2012-04-13T15:01:19.280 回答
4

在property_exists()的帮助下,您可以轻松地从 php 文件中删除“未定义属性”通知。

以下是示例:

if(property_exists($structure,'parts')){ $parts = $structure->parts; }

了解更多http://php.net/manual/en/function.property-exists.php

于 2015-02-04T11:44:10.043 回答
4

2020 年来到这里,惊讶地发现没有人提到:

1.自 PHP 7.0 起

$parts = $structure->parts ?? false;

2.一个不受欢迎的做法- stfu 运算符

$parts = @$structure->parts;
于 2020-04-07T11:10:58.733 回答
1

我已经为多级链接编写了一个辅助函数。假设您想做类似的事情$obj1->obj2->obj3->obj4,只要其中一个层未定义或为空,我的辅助函数就会返回空字符串,所以$obj1->obj2->obj3->obj4我的使用代替您MyUtils::nested($obj1, 'obj2', 'obj3', 'obj4')。同样使用这个辅助方法也不会产生任何通知错误。从语法上讲,它不是最好的,但实际上非常舒适。

class MyUtils
{
    // for $obj1->obj2->obj3: MyUtils::nested($obj1, 'obj2', 'obj3')
    // returns '' if some of tiers is null
    public static function nested($obj1, ...$tiers)
    {
        if (!isset($obj1)) return '';
        $a = $obj1;
        for($i = 0; $i < count($tiers); $i++){
            if (isset($a->{$tiers[$i]})) {
                $a = $a->{$tiers[$i]};
            } else {
                return '';
            }
        }
        return $a;
    }
}
于 2020-12-19T07:33:53.310 回答