【问题标题】:PHP function : Return a object value if it's setPHP函数:如果已设置,则返回对象值
【发布时间】:2016-12-08 06:19:56
【问题描述】:

我正在尝试输出 on 对象的值,但某些对象记录可能不存在该值。如何返回值而不引发错误“未定义属性:stdClass”

例如,我有一个对象:

$obj = '[{"id":111,"value1":1,"value2":2},{"id":111,"value1":1}]';

value2对于数组中的第二个元素不存在,我想写一个函数来处理数组中的每个对象。示例:

function add($obj){
   $sum = 0;
   foreach($obj as $o){
      $sum += $o->value1;          

       if(isset($o->value2)){
          $sum += $o->value2;
       }
   }
   return $sum;
}

if 部分是我想要改进的部分。某些对象可能不存在许多其他值。我不想每次都写if(isset($o->valueN))

有没有其他更简单的方法来编写代码以避免未定义的属性错误?

【问题讨论】:

标签: php


【解决方案1】:

选项 1:在 php7 中,您可以使用 Null Coalescing Operator,

$sum += $o->value2 ?? 0;

方案2:如果你可以为子项创建特定的类,那么你可以使用魔术方法__get(),这样你只需要写一次isset

选项 3:接受吗?我的代码中到处都是 isset()s,因为它很好地提醒了某些东西可能会或可能不会被设置,但你知道它并且正在处理它。

【讨论】:

    【解决方案2】:

    这将确保您只添加您想要的并且仅当它们存在于数组中时。

    ini_set('display_errors', 1); ini_set('log_errors',1); 
    
    $obj = '[{"id":111,"value1":1,"value2":2},{"id":111,"value1":1}]';
    $obj_array = json_decode($obj);
    
    $required_occ = ['value1', 'value2'];
    
    $sum = 0;
    
    foreach ( $obj_array as $obj ) {
        foreach ( $required_occ as $occ ) {
            if ( isset($obj->$occ) ) {
                $sum += $obj->$occ;
            }
        }
    }
    
    echo $sum;
    

    结果

    4
    

    或者减少一点,如果你使用的是 PHP7 并使用 Null Coalescing Operator

    ini_set('display_errors', 1); ini_set('log_errors',1); 
    
    $obj = '[{"id":111,"value1":1,"value2":2},{"id":111,"value1":1}]';
    $obj_array = json_decode($obj);
    
    $required_occ = ['value1', 'value2'];
    $sum = 0;
    foreach ( $obj_array as $obj ) {
        foreach ( $required_occ as $occ ) {
            $sum += $obj->{$occ} ?? 0;
        }
    }
    
    echo $sum;
    

    结果

    4
    

    【讨论】:

      猜你喜欢
      • 2019-08-30
      • 1970-01-01
      • 2020-11-13
      • 2013-07-25
      • 1970-01-01
      • 2017-07-15
      • 2021-01-12
      • 2020-07-19
      • 2020-02-14
      相关资源
      最近更新 更多