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