双取反按位运算符 (~~) - 也称为 "double tilde" - 在 PHP 中有什么作用?

What is the effect of a double negating bitwise operator (~~) - also called "double tilde" - in PHP?

重构遗留代码我发现了以下构造的各种情况:

((bool) ~~$field->req ? ' required' : '')

根据the manual PHP 中的波浪号 (~) 是按位非,它简单地将变量中的所有位移动到它们的相反位置。

如果我将一个变量中的所有位都移到相反的位置,然后再将其移回,该变量应该与之前完全相同,对吗?那么为什么会有人这样做呢?我错过了什么吗?

它应该是 !!(它将值转换为布尔值)但根本不需要。我猜原来的编码器将 ~ 误认为是 ! 然后他们在它前面添加了 (bool) 以达到预期的结果(因为,正如您在问题中注意到的那样, ~~ 是无操作)。

ternary operator (?:) 强制将其第一个参数评估为布尔值。

$field->reqboolean value!! $field->req(bool) ~~$field->req 相同(顺便说一句,(bool)$field->req)。

我会完全删除 (bool) ~~ 部分以获得更小更清晰的代码。

发问者编辑PHP中~~的唯一作用是从浮点值中截取小数 .

查看以下结果:

$a = 2.123;
$b = -2.123;
$c = new stdClass();
$d = ["a",2,"c"];
$e = "lord";
$f = -3;
$g = false;
$h = null;
$j = -2.99;
$k = 2.99;


var_dump(~~$a);
var_dump(~~$b);
// var_dump(~~$c); // error
// var_dump(~~$d); // error
var_dump(~~$e);
var_dump(~~$f);
// var_dump(~~$g); // error
// var_dump(~~$h); // error
var_dump(~~$j);
var_dump(~~$k);

var_dump(!!$a);
var_dump(!!$b);
var_dump(!!$c);
var_dump(!!$d);
var_dump(!!$e);
var_dump(!!$f);
var_dump(!!$g);
var_dump(!!$h);
var_dump(!!$j);
var_dump(!!$k);

int(2) int(-2) string(4) "lord" int(-3) int(-2) int(2) bool(true) bool(true) bool(true) bool(true) bool(true) bool(true) bool(false) bool(false) bool(true) bool(true)