2017-02-19 4 views
4

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

код: 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) ===

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

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

ответ

2

Итак, давайте сломаем его.

ord("\xC0"); 

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

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

Теперь ord("\xE9")/64 работает на 3.640625, и мы можем увидеть where it breaks down here

var_dump(ord(chr(3.640625))); 

Это 0 со строгими типами и 3 без. Per the manual for chr

string chr (int $ascii) 

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

Per the manual

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

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

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

Nice breakdown and explain. – Darren