重构遗留代码我发现了以下构造的各种出现:
((bool) ~~$field->req ? ' required' : '')
根据手册,PHP 中的波浪号 (~) 是按位非,它简单地将变量中的所有位移动到相反的位置。
如果我将变量中的所有位移到相反的位置,然后将其移回,则该变量应该与之前完全相同,对吗?那么为什么有人会这样做呢?我错过了什么吗?
重构遗留代码我发现了以下构造的各种出现:
((bool) ~~$field->req ? ' required' : '')
根据手册,PHP 中的波浪号 (~) 是按位非,它简单地将变量中的所有位移动到相反的位置。
如果我将变量中的所有位移到相反的位置,然后将其移回,则该变量应该与之前完全相同,对吗?那么为什么有人会这样做呢?我错过了什么吗?
它应该是!!
(它将值转换为布尔值)但根本不需要它。我猜原来的编码器被误认为~
是!
他们(bool)
在它前面添加以达到预期的结果(因为,正如您在问题中注意到的那样,~~
它是无操作的)。
三元运算符 ( ?:
)强制将其第一个参数评估为布尔值。
的布尔值$field->req
与 of和!! $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)布尔(真) 布尔(假) 布尔(假) 布尔(真) 布尔(真)