1

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

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

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

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

4

1 回答 1

1

它应该是!!(它将值转换为布尔值)但根本不需要它。我猜原来的编码器被误认为~!他们(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)布尔(真) 布尔(假) 布尔(假) 布尔(真) 布尔(真)

于 2018-06-26T13:54:45.743 回答