在浏览我正在贡献的项目的源代码时,我找到了这行代码:
$id or $id = $this->id;
它似乎正常工作,它有点像PHP 5中缺少空合并运算符/处理程序的解决方法。'或'关键字能够执行此类代码。但是,我想知道这是否是一个很好的PHP编程实践。你怎么看?编写这样的($x or $x = $y)
代码是个好主意吗?
答案 0 :(得分:2)
这个问题主要是自以为是,但你设法提出了一个有效的问题。
仅供快速参考,在PHP 7中有 null coalesce operator ,它可以在一个简短的代码中快速有效地执行此操作:
$id = $id ?? -1;
或链式$id = $id ?? $this->id ?? -1
这会将每个
进行比较?? {arg} ?? {arg}
与isset()
但为什么不用或语句呢?
<强>赞成强>
<强>缺点强>
如果你不完全理解类型比较在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
,可能会在代码中创建错误。