битовая манипуляция — каков эффект двойного отрицательного побитового оператора (~~) — также называется «двойная тильда» — в PHP?

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

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

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

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

1

Решение

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

троичный оператор (?:) вынуждает оценку своего первого аргумента как логического.

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]