2017-02-19 56 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 (with strict_types = 1)===

也許有人可以向我解釋這一點?我認爲這是因爲「chr()」期待一個整數,但我們得到一個浮點數?!但是沒有任何警告或類似的東西......? - >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沒有。每the manual for chr

string chr (int $ascii) 

所以這裏的結果是float,不是int。發生了什麼事是嚴格類型不能在float轉換爲int,所以它通過一個0

Per the manual

在嚴格模式下,只有確切類型的類型聲明的變量將被接受,或TypeError將被拋出。 這條規則的唯一例外是可以給一個期望float的函數一個整數。

我們走的是另一條路。所以嚴格類型的行爲就像所有的PHP當你通過它一個不合適的論點

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

細分和解釋。 – Darren