0

在浏览我参与的项目的源代码时,我发现这行代码:

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

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

4

1 回答 1

2

这个问题主要是固执己见,但你设法提出了一个有效的问题。

只是为了快速参考,在 PHP 7 中有一个空合并运算符,它可以在 1 个短代码中快速有效地执行此操作:

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

因为这?? {arg} ?? {arg}比较isset()


但是为什么不使用or语句呢?

优点

  1. 它很短(1 衬里)
  2. 相当快速且易于阅读。
  3. 三元运算符简单
  4. 代码解析速度很可能更快

缺点

  1. 骗人

如果你不完全理解 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

有关该表的完整列表,您可以查看链接。


它的工作方式类似于!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实际设置,可能会在代码中产生错误。

于 2016-04-13T20:03:07.910 回答