PHP 7 | chr()+ strict_types ===错误?

时间:2017-02-19 23:32:51

标签: php php-7

我尝试将我正在运行的PHP 5.x代码转换为更现代的PHP 7.x代码库,因此我添加了" declare(strict_types = 1);"在第一步,但它没有按预期工作。

代码:extern "C"

演示: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

1 个答案:

答案 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

Per the manual

  

在严格模式下,只接受类型声明的确切类型的变量,否则将抛出TypeError。 此规则的唯一例外是可以为期望浮动的函数提供整数。

我们正走另一条路。因此,当你传递一个错误的参数时,严格类型的行为就像所有PHP一样

var_dump(ord(chr('bob'))); // string 0, in all PHP versions
相关问题