我尝试将我正在运行的PHP 5.x代码转换为更现代的PHP 7.x代码库,因此我添加了" declare(strict_types = 1);"在第一步,但它没有按预期工作。
代码:extern "C"
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
答案 0 :(得分: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
没有。每the manual for chr
string chr ( int $ascii )
所以这里的结果是float
,而不是int
。发生的事情是严格类型无法将float
转换为int
,因此它会传递0
在严格模式下,只接受类型声明的确切类型的变量,否则将抛出TypeError。 此规则的唯一例外是可以为期望浮动的函数提供整数。
我们正走另一条路。因此,当你传递一个错误的参数时,严格类型的行为就像所有PHP一样
var_dump(ord(chr('bob'))); // string 0, in all PHP versions