使用'或'进行null检查一个很好的PHP编程实践?

时间:2016-04-13 18:37:46

标签: php if-statement null-check

在浏览我正在贡献的项目的源代码时,我找到了这行代码:

$id or $id = $this->id;

它似乎正常工作,它有点像PHP 5中缺少空合并运算符/处理程序的解决方法。'或'关键字能够执行此类代码。但是,我想知道这是否是一个很好的PHP编程实践。你怎么看?编写这样的($x or $x = $y)代码是个好主意吗?

1 个答案:

答案 0 :(得分:2)

这个问题主要是自以为是,但你设法提出了一个有效的问题。

  

仅供快速参考,在PHP 7中有 null coalesce operator ,它可以在一个简短的代码中快速有效地执行此操作:

     
    

$id = $id ?? -1;或链式$id = $id ?? $this->id ?? -1

  
     

这会将每个?? {arg} ?? {arg}isset()

进行比较

但为什么不用语句呢?

<强>赞成

  1. 很短(1-lining)
  2. 相当快速且易于阅读。
  3. 不如三元运算符
  4. 复杂
  5. 最有可能在代码解析方面更快
  6. <强>缺点

    1. 非常欺骗
    2. 如果你不完全理解类型比较在PHP中如何工作,它最终会咬你。如果您认为这是isset(),那么您就错了,因为它会错误地读取代码。因此我会反对使用这种方法。

      expression       if       isset    empty
      
      $x = "";         FALSE    TRUE     TRUE
      $x = null;       FALSE    FALSE    TRUE
      var $x;          FALSE    FALSE    TRUE
      $x (undefined)   FALSE    FALSE    TRUE
      $x = [];         FALSE    TRUE     TRUE
      $x = ['a', 'b']; TRUE     TRUE     FALSE
      $x = false;      FALSE    TRUE     TRUE
      $x = true;       TRUE     TRUE     FALSE
      $x = 1;          TRUE     TRUE     FALSE
      $x = 42;         TRUE     TRUE     FALSE
      $x = 0;          FALSE    TRUE     TRUE
      $x = -1;         TRUE     TRUE     FALSE
      $x = "1";        TRUE     TRUE     FALSE
      $x = "0";        FALSE    TRUE     TRUE
      $x = "-1";       TRUE     TRUE     FALSE
      $x = "php";      TRUE     TRUE     FALSE
      $x = "true";     TRUE     TRUE     FALSE
      $x = "false";    TRUE     TRUE     FALSE
      

      有关表格的完整列表,您可以看到this链接。

      它的工作方式与!empty()类似,请参阅以下示例:

      if(($id or $id = $this->id) > 0){
        echo "Greater then 0";
      }
      
      if(($id = !empty($id) ? $id : $this->id) > 0){
        echo "Greater then 0";
      }
      

      大多数人都不知道这一点。代码也不明显。因此,虽然我现在完全能够阅读代码,但是当我下个月阅读它时会更加混乱。

      此代码中还有一个问题,如果实际设置$this->id,可能会在代码中创建错误。