double not运算符在PHP中做什么?

例如:

return !! $row;

上面的代码会做什么?


当前回答

让我们看看

!$a;

而不是解读!算子作为取

布尔值与它右边的值相反

read

取与表达式相反的布尔表达式

在这种情况下

$a;

可以是表达式

所以是

!$a;

那么,

!!$a;

and

!!!$a;

依此类推,因为每个表达式都是有效的表达式,所以!运算符可以加在它们的前面。

其他回答

这意味着如果$row有一个真值,它将返回true,否则返回false,转换为布尔值。

下面是php文档中表达式到布尔值转换的示例。

Expression             Boolean
$x = "";               FALSE
$x = null;             FALSE
var $x;                FALSE
$x is undefined        FALSE
$x = array();          FALSE
$x = array('a', 'b');  TRUE
$x = false;            FALSE
$x = true;             TRUE
$x = 1;                TRUE
$x = 42;               TRUE
$x = 0;                FALSE
$x = -1;               TRUE
$x = "1";              TRUE
$x = "0";              FALSE
$x = "-1";             TRUE
$x = "php";            TRUE
$x = "true";           TRUE
$x = "false";          TRUE

它与转换为bool类型相同(或几乎相同-可能有一些极端情况)。如果$row转换为true,那么!!$row也是true。

但如果你想实现(bool) $row,你可能应该使用它——而不是一些“有趣的”表达式;)

在许多语言中,“not not”是一种方便的方式,用于理解语言赋予任何表达式的结果的真值。例如,在Python中:

>>> not not []
False
>>> not not [False]
True

当您想要将一个复杂的值简化为“到底有没有值?”时,使用这种方法非常方便。

让我们看看

!$a;

而不是解读!算子作为取

布尔值与它右边的值相反

read

取与表达式相反的布尔表达式

在这种情况下

$a;

可以是表达式

所以是

!$a;

那么,

!!$a;

and

!!!$a;

依此类推,因为每个表达式都是有效的表达式,所以!运算符可以加在它们的前面。

它不是"双重非算子"而是应用了两次的非算子。右边!将得到一个布尔值,与操作数无关。然后左转!会对布尔值求反。

这意味着对于任何真值(非零的数字,非空字符串和数组等),您将得到布尔值true,而对于任何假值(0,0.0,NULL,空字符串或空数组),您将得到布尔值false。

它在功能上等价于转换为布尔类型:

return (bool)$row;