2017-02-19 7 views
4

Ich versuche, meinen funktionierenden PHP 5.x Code in eine modernere PHP 7.x Code-Basis umzuwandeln, also habe ich "declare (strict_types = 1);" im ersten Schritt, aber es hat nicht wie erwartet funktioniert.PHP 7 | chr() + strict_types === Fehler?

Code: ord(chr(ord("\xE9")/64) | "\xC0");

Demo: https://3v4l.org/680ts

Github: https://github.com/voku/portable-utf8/blob/master/src/voku/helper/UTF8.php#L6613

PHP < 7.0 oder> 7.0 (ohne strict_types = 1) ===

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

Vielleicht kann mir jemand das erklären? Ich denke, es ist wegen "chr()" erwartet eine ganze Zahl, aber wir bekommen einen Schwimmer ?! Aber es gibt keine Warnung oder so etwas ...? ->http://php.net/manual/en/migration70.incompatible.php#migration70.incompatible.strings.hex

Antwort

2

Also, lasst uns es brechen.

Das ist 192. Mit oder ohne strikte Typen. Die Aufteilung geschieht hier

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

Jetzt ord("\xE9")/64-3,640625 ausarbeitet und können wir where it breaks down here

var_dump(ord(chr(3.640625))); 

Dies ist 0 mit strengen Typen und 3 ohne sehen. Per the manual for chr

string chr (int $ascii) 

So, hier ist das Ergebnis ein float, kein int. Was passiert, ist, dass strenge Typen die float zu einem int nicht umwandeln können, so gibt sie ein 0

Per the manual

Im strikten Modus nur eine Variable vom genauen Typ der Typdeklaration wird akzeptiert, oder ein TypeError wird ausgelöst. Die einzige Ausnahme von dieser Regel ist, dass eine Integer-Funktion an eine Funktion übergeben werden kann, die einen Float erwartet.

Wir gehen in die andere Richtung. So strikte Typen verhalten sich wie alle PHP, wenn man ein schlechtes Argument übergibt

+0

Schöne Aufteilung und Erklärung. – Darren