Каков эффект двойного отрицательного побитового оператора (~~) - также называемого «двойной тильдой» - в PHP? - PullRequest
0 голосов
/ 26 июня 2018

Рефакторинг устаревшего кода Я обнаружил различные вхождения следующей конструкции:

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

Согласно руководству тильда (~) в PHP не является побитовой, что просто сдвигает все биты в переменной к их противоположности.

Если я сдвину все биты в переменной к их противоположности, а затем вернусь назад, переменная должна быть точно такой же, как была раньше, верно? Так зачем кому-то это делать? Я что-то упустил?

1 Ответ

0 голосов
/ 26 июня 2018

Это должно быть !! (оно преобразует значение в логическое значение), но оно вообще не нужно. Я предполагаю, что оригинальный кодировщик принял ~ за !, тогда они добавили (bool) перед ним, чтобы достичь желаемого результата (потому что, как вы заметили в вопросе, ~~ - это запрет)

Тернарный оператор (?:) заставляет вычислять его первый аргумент как логический.

Логическое значение для $field->req такое же, как для !! $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) string (4) "Лорд" int (-3) int (-2) int (2) bool (правда) bool (правда) bool (правда) bool (правда) bool (правда) bool (правда) bool (false) bool (false) bool (true) bool (true)

...