在浏览我参与的项目的源代码时,我发现这行代码:
$id or $id = $this->id;
它似乎工作正常,这有点像 PHP 5 中缺少空合并运算符/处理程序的解决方法。“或”关键字能够执行此类代码。但是,我想知道这是否是 PHP 中一个好的编程习惯。你怎么看?($x or $x = $y)
编写这样的代码 是个好主意吗?
在浏览我参与的项目的源代码时,我发现这行代码:
$id or $id = $this->id;
它似乎工作正常,这有点像 PHP 5 中缺少空合并运算符/处理程序的解决方法。“或”关键字能够执行此类代码。但是,我想知道这是否是 PHP 中一个好的编程习惯。你怎么看?($x or $x = $y)
编写这样的代码 是个好主意吗?
这个问题主要是固执己见,但你设法提出了一个有效的问题。
只是为了快速参考,在 PHP 7 中有一个空合并运算符,它可以在 1 个短代码中快速有效地执行此操作:
$id = $id ?? -1;
或链式$id = $id ?? $this->id ?? -1
因为这
?? {arg} ?? {arg}
比较isset()
但是为什么不使用or语句呢?
优点
缺点
如果你不完全理解 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
实际设置,可能会在代码中产生错误。