PHP数组的赋值及使用方式

3

我正在学习PHP,并查看其他人的代码。我不确定在这个函数中左侧使用'and'词和等号操作符时发生了什么。它似乎是在使用“静默”if,例如,如果$arry = true and $array2 = true,则$array2 + ='something';

我似乎找不到任何关于这方面的参考资料。

  function get_list_filter($filter = array()) {
     global $current_user;
    $sql = array();
    $filter["clientID"]         and $sql[] = sprintf("(WD_domain.clientID = %d)",$filter["clientID"]);
    $filter["showDomainName"]   and $sql[] = sprintf("(WD_domain.domain LIKE '%%%s%%')",$filter["showDomainName"]);
    $filter["showManaged"]      and $sql[] = sprintf("(WD_domain.managed = %d)",$filter["showManaged"]);
    return $sql;
  }

我喜欢 PHP 编译器。它让代码变得如此独特! - The Surrican
2
这种技术被称为“短路评估”或“短路”。 - BoltClock
2个回答

5
$foo and $bar = "baz";

只是一个含混不清的说法。
if ($foo)
    $bar = "baz";

谴责那个写这个的人。

这并不总是坏事:confirmed() or redirect('/not-confirmed'); - Petah
@Petah:有趣的是,我见过的 PHP 用户中只有大约一半能够解释它是如何工作以及为什么这样工作。 - Matti Virkkunen
我认为它唯一的“问题”就是可读性和用户知识。我也无法通过搜索找到任何有关它的信息。尽管我从查找“短路”这个术语(由boltlock提供)时发现,一些语言使用关键字“sand”和“sor”,这将在阅读代码时给出更好的视觉提示,表明某些事情正在发生。 - Elijha

4
这意味着如果and的左侧计算结果为true,则右侧也将被执行。实质上,如果clientID计算结果为true(非false),则sprintf("(WD_domain.clientID = %d)",$filter["clientID"])将被添加到$sql数组中。这是一种懒惰的方式:
if($filter["clientID"]) {
    $sql[] = sprintf("(WD_domain.clientID = %d)",$filter["clientID"]);
}

好的,这就是我想要的解释,因为单行中的“and”并没有帮助说明为什么第二个元素值被赋值。 这种简写评估有一个名称吗? - Elijha
1
@Elijha:这被称为短路。请查看我在你的问题上的评论,里面有一个链接。 - BoltClock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接