重构遗留代码我发现以下结构的各种出现:
((bool) ~~$field->req ? ' required' : '')
根据the manual,PHP中的Tilde(〜)不是按位的,它简单地将变量中的所有位都移到相反的位置。
如果我将变量中的所有位都移到相反的位置,然后再移回去,那么该变量应该与之前正确地相同吗?那为什么有人要这样做呢?我想念什么吗?
答案 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)