Рефакторинг устаревшего кода Я обнаружил различные вхождения следующей конструкции:
((bool) ~~$field->req ? ' required' : '')
В соответствии с руководство Тильда (~) в PHP не является побитовой, что просто сдвигает все биты в переменной к их противоположности.
Если я сдвину все биты в переменной к их противоположности, а затем вернусь назад, переменная должна быть точно такой же, как была раньше, верно? Так зачем кому-то делать это? Я что-то пропустил?
Так должно быть !!
(он преобразует значение в логическое значение), но это вовсе не нужно. Я думаю, что оригинальный кодер ошибся ~
за !
затем они добавили (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)
Других решений пока нет …