【问题标题】:Is using 'or' for null check a good PHP programming practice? [closed]使用“或”进行空值检查是一种好的 PHP 编程习惯吗? [关闭]
【发布时间】:2016-08-05 01:07:00
【问题描述】:

在浏览我正在贡献的项目的源代码时,我发现这行代码:

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

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

【问题讨论】:

  • 我个人认为它的可读性不是很高。我也不确定它如何处理 $id 为假但不为空的情况。不过现在 PHP 7 已经发布了,希望这些黑客行为不再那么常见。
  • 这个问题似乎更适合出现在以下位置的内容类型:programmers.stackexchange.com
  • 这告诉我,NO Notice: Undefined variable: id
  • 我不认为这是一种 baaaaaaaad 的做法。我的意思是,javascript 使用了很多(好吧,这里不是最好的比较,哈哈)但是 C# 现在有一个空运算符,可以像 var data = Obj?.Property?.Method() 这样使用。 or 声明可能会被重写为 $id = isset($id) ? $id : $this->id,所以我认为它是一个简短的版本......
  • @AbraCadaver:实际上并没有通知错误,因为此代码来自一个接受 $id 作为参数且默认值为 null 的类方法:public function xml($id = null)。跨度>

标签: php if-statement null-check


【解决方案1】:

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

仅供快速参考,在 PHP 7 中有 null coalesce 运算符,它可以在 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

有关表格的完整列表,您可以查看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,可能会在代码中产生错误。

【讨论】:

    猜你喜欢
    • 2010-09-14
    • 2013-03-30
    • 2015-02-18
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 2018-12-01
    • 1970-01-01
    相关资源
    最近更新 更多