PHP 7 — PHP 7 | chr () + strict_types === ошибка?

Я пытаюсь преобразовать мой рабочий код PHP 5.x в более современную кодовую базу PHP 7.x, поэтому я добавил «Declare (strict_types = 1)»; на первом этапе, но это не сработало, как ожидалось.

код: ord(chr(ord("\xE9") / 64) | "\xC0");

демо: https://3v4l.org/680ts

GitHub: https://github.com/voku/portable-utf8/blob/master/src/voku/helper/UTF8.php#L6613

PHP < 7.0 или> 7.0 (без strict_types = 1) === 195

PHP> 7.0 (с strict_types = 1) === 192

Может быть, кто-то может объяснить это мне? Я думаю, это потому, что chr () ожидает целое число, но мы получаем число с плавающей точкой ?! Но нет никаких предупреждений или что-то вроде этого …? -> http://php.net/manual/en/migration70.incompatible.php#migration70.incompatible.strings.hex

4

Решение

Итак, давайте разберемся с этим.

ord("\xC0");

Это 192. С или без строгих типов. Здесь происходит срыв

chr(ord("\xE9") / 64)

Сейчас ord("\xE9") / 64 работает до 3.640625, и мы можем видеть где это ломается здесь

var_dump(ord(chr(3.640625)));

Это 0 со строгими типами, и 3 без. в руководство для chr

string chr ( int $ascii )

Таким образом, результат здесь floatне int, Происходит то, что строгие типы не могут преобразовать float для intтак что проходит 0

Согласно инструкции

В строгом режиме будет принята только переменная точного типа в объявлении типа, или будет выдана ошибка TypeError. Единственное исключение из этого правила состоит в том, что целое число может быть дано функции, ожидающей float.

Мы идем другим путем. Так что строгие типы ведут себя как все PHP, когда вы передаете ему плохой аргумент

var_dump(ord(chr('bob'))); // string 0, in all PHP versions
2

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector