Я пытаюсь преобразовать мой рабочий код 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
Итак, давайте разберемся с этим.
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
Других решений пока нет …