在PHP中,双重否定按位运算符(~~)(也称为“ double tilde”)的作用是什么?

时间:2018-06-26 11:36:10

标签: php bit-manipulation bitwise-operators bitwise-not

重构遗留代码我发现以下结构的各种出现:

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

根据the manual,PHP中的Tilde(〜)不是按位的,它简单地将变量中的所有位都移到相反的位置。

如果我将变量中的所有位都移到相反的位置,然后再移回去,那么该变量应该与之前正确地相同吗?那为什么有人要这样做呢?我想念什么吗?

1 个答案:

答案 0 :(得分:1)

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

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

$field->req的{​​{3}}与!! $field->req(bool) ~~$field->req(和(bool)$field->req btw)相同。

我将完全删除(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)字符串(4)“主” int(-3)int(-2)int(2)   布尔(true)布尔(true)布尔(true)布尔(true)布尔(true)布尔(true)   bool(false)bool(false)bool(true)bool(true)