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 ===

PHP(strict_types = 1を含まない)> 7.0 (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です。何が起こっていることは、厳密な型がintfloatを変換することができないので、それはstrictモードで0

Per the manual

を渡し、型宣言の正確な型の唯一の変数は受け入れ、またはされますTypeErrorがスローされます。 この規則の唯一の例外は、浮動小数点を期待する関数に整数を与えることができることです。

私たちは逆です。だから厳密な型は、あなたがそれを悪い引数を渡すと、すべてのPHPのように振る舞います。

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

素敵な内訳と説明。 – Darren