PHP 7 IST DA Glen Langer Contao Camp 2016 in Nürnberg Version: 1.2.0 vom 10.02.2017 (Bild: PHP.net) Slides erstellt mit der Erweiterung "contao-reveal-js-theme" von BugBuster 1. 1
ÜBER MICH Contao seit 2.5.8 PHP ZCE Forum: BugBuster Camp: James Buster, im Auftrag von Contao http://contao.ninja/ 2. 1
INHALT Umstieg, wann und warum? Neue, zu alte und fast zu alte Funktionen Inkompatibilitäten Migrationshinweise, speziell für Contao Erweiterungen Tools 3. 1
UMSTIEG, WANN UND WARUM? http://php.net/supported-versions.php PHP 7.1 wurde am 02.12.2016 veröffentlicht 4. 1
UMSTIEG, WANN UND WARUM? Aus Performance Gründen! Kern von PHP grundlegend überarbeitet, gegenüber PHP 5.0 soll PHP 7.0 ganze 10-14 mal schneller sein, gegenüber PHP 5.6 immerhin doppelt so schnell und dabei mit geringerem Speicherverbrauch. 4. 2
NEUES Null coalescing Operator (??) Spaceship-Operator (<=>) Array Konstanten Anonyme Klassen Exception Handling (eventuell zu Inkompatibilitäten) 5. 1
Null coalescing Operator (??) $sortby = $_GET['sortBy']?: 'name'; Problem, wenn "sortby" nicht gesetzt. Lösung bisher: $sortby = isset($_get['sortby'])? $_GET['sortBy'] : 'name'; Lösung mit PHP 7: $sortby = $_GET['sortBy']?? 'name'; 5. 2
Spaceship-Operator (<=>) Ein Drei-Wege-Vergleich, vereinfacht Sortierungen. echo 1 <=> 1; // 0 echo 1 <=> 2; // -1 echo 2 <=> 1; // 1 echo "a" <=> "a"; // 0 echo "a" <=> "b"; // -1 echo "b" <=> "a"; // 1 echo [] <=> []; // 0 echo [1, 2, 3] <=> [1, 2, 3]; // 0 echo [1, 2, 3] <=> []; // 1 echo [1, 2, 3] <=> [1, 2, 1]; // 1 echo [1, 2, 3] <=> [1, 2, 4]; // -1 5. 3
Array Konstanten Konstanten können nun auch ein Array beinhalten: define('farben', ['rot', 'blau', 'grün']); echo FARBEN[0]; // rot 5. 4
Anonyme Klassen interface Logger { public function log($message); } $echologger = new class implements Logger { public function log($message) { echo $message. "\n"; } }; $echologger->log("hello World!"); 5. 5
Exception Handling Alle fatalen Fehler sind in PHP 7 Exceptions. Diese können nun abgefangen werden, ohne sofortigen Abbruch des Programms. Dazu gehört zum Beispiel der ehemals fatale Fehler: "Call to a member function?() on a non object". $foo = null; $foo->methodcall(); 5. 6
Exception Handling Laufzeitfehler, genau wie Exceptions, werde nun von einem neuen Interface Throwable abgeleitet. Diese können nun entweder über dieses Interface oder die Basisklasse Error abgefangen werden. Achtung: Error!= Exception $foo = null; try { $foo->methodcall(); } catch (Exception $ex) { echo "Fehler: ". $ex->getmessage(); } // PHP Fatal Error... 5. 7
In PHP 7 nun möglich: Exception Handling $foo = null; try { $foo->methodcall(); } catch (Error $ex) { echo "Fehler: ". $ex->getmessage(); } // Fehler: Call to a member function... 5. 8
Exception Handling Mit catch (Throwable) lassen sich Exceptions und Errors fangen: $foo = null; try { $foo->methodcall(); } catch (Throwable $ex) { echo "Fehler: ". $ex->getmessage(); } // Fehler: Call to a member function... 5. 9
Exception Handling Variante die kompatibel ist mit PHP 5 und PHP 7: try { // Code that may throw an Exception or Error. } catch (Throwable $t) { // Executed only in PHP 7, will not match in PHP 5.x } catch (Exception $e) { // Executed only in PHP 5.x, will not be reached in PHP 7 } 5. 10
REMOVED EXTENSIONS - ext/mssql - ext/mysql - ext/sybase_ct - ext/ereg - ext/mcrypt (ab 7.2, deprecated in 7.1 ) 6. 1
INKOMPATIBILITÄTEN Inkompatible Features Skalare Typehints Uniform variable syntax (Auswertungsreihenfolge) Änderungen bei 'list' Änderungen bei 'foreach' func_get_args() 7. 1
Skalare Typehints Vor PHP 7 waren Typehints nur für Objekte und Arrays möglich. Nun auch für primitive Datentypen. Daher ist es nun nicht mehr möglich, Klassen, Interfaces, Traits wie folgt im Namen zu deklarieren: (case-insensitive) ab 7.0: bool, int, float, string, null, false, true ab 7.1: void, iterable Das betrifft auch die Verwendung der Namen bei class_alias() und use Statements. Für die Zukunft sind folgende Namen reserviert, erzeugen aber noch keine Fehlermeldung: resource, object, mixed, numeric 7. 2
Skalare Typehints Auch der Rückgabetyp von Funktionen / Methoden kann nun vorgegeben werden! Komplettes Beispiel: function addition (int $num1, float $num2, string $text) : string { return $text. ": ". ($num1 + $num2); } echo addition(2, 1.14, "Ergebnis"); //Ergebnis: 3.14 7. 3
Skalare Typehints Werden die Parameter vom Typ nicht eingehalten, passiert folgendes: function addition (int $num1, float $num2, string $text) : int { return $text. ": ". ($num1 + $num2); } echo addition("2hallo", 1.14, 42); //PHP Notice: A non well formed numeric value encountered... line 1 //PHP Notice: A non well formed numeric value encountered... line 3 //42 7. 4
Skalare Typehints Strengere Prüfung mit strict types, Ausgabe eines Fatal Errors bei Kon ikten: declare(strict_types=1); function addition (int $num1, float $num2, string $text) : string { return $text. ": ". ($num1 + $num2); } echo addition(2, 1.14, 42); //PHP Fatal error: Uncaught TypeError: Argument 3... //must be of type string, integer given Zulässig wäre hier trotzdem ein Integer statt Float zu übergeben, das wird konvertiert. Hinweis: die "declare" Zeile, die am Anfang einer Datei gesetzt werden kann, muss in jeder Datei enthalten sein, wo die strenge Prüfung gewünscht ist. 7. 5
Uniform variable syntax (Auswertungsreihenfolge) Expression PHP 5 interpretation PHP 7 interpretation $$foo['bar']['baz'] ${$foo['bar']['baz']} ($$foo)['bar']['baz'] $foo->$bar['baz'] $foo->{$bar['baz']} ($foo->$bar)['baz'] $foo->$bar['baz']() $foo->{$bar['baz']}() ($foo->$bar)['baz']() Foo::$bar['baz']() Foo::{$bar['baz']}() (Foo::$bar)['baz']() Hint: Use the syntax of the PHP5 interpretation, which is also understood in PHP7. 7. 6
Änderungen bei 'list' Bei Verwendung von nur einem Array weist list() in PHP 5 die Werte von rechts beginnend zu. In PHP 7 beginnt list() von links. //ohne Arrays $info = array('kaffee', 'braun', 'Koffein'); list($drink, $color, $power) = $info; echo "{$drink} - {$color} - {$power}.\n" ; //Kaffee - braun - Koffein. //mit unterschiedlichen Arrays list($a[], $b[], $c[]) = $info; echo "$a[0] - $b[0] - $c[0].\n" ; //Kaffee - braun - Koffein. //aber mit dem selben Array list($a[], $a[], $a[]) = $info; echo "$a[0] - $a[1] - $a[2].\n" ; //PHP 5: Koffein - braun - Kaffee. //PHP 7: Kaffee - braun - Koffein. 7. 7
Änderungen bei 'foreach' Der interne Zeiger innerhalb von foreach im iterierten Array wird nicht mehr modi ziert. Bei zusätzlicher Verwendung der Array- Funktionen current() oder next() innerhalb einer foreach-schleife, wird sich der entsprechende Code unter PHP 7 anders verhalten. $array = [0, 1, 2]; foreach ($array as $key) { var_dump(current($array)); next($array); } //PHP 5: int(1), int(2), bool(false) //PHP 7: int(0), int(1), int(2) 7. 8
Inkompatibilität: func_get_arg[s]() PHP 5: func_get_arg() / func_get_args() liefert immer die Originalwerte der Funktionsparameter. Werden die Werte vor dem Aufruf verändert, werden trotzdem die alten Werte geliefert. PHP 7: Hier würde man die veränderten Werte erhalten. 7. 9
Inkompatibilität: func_get_arg() function foo($x) { $x++; var_dump(func_get_arg( 0)); } foo(1); Ergibt in PHP 5: 1 Ergibt in PHP 7: 2 7. 10
DEPRECATED FEATURES PHP 4 Style Konstruktoren Nicht-statische Methoden sollten nicht mehr statisch aufgerufen werden Password hash (salt option) 8. 1
DEPRECATED FUNCTIONS autoload() (ab PHP 7.2) Ersatz ab PHP 5.1 durch spl_autoload_register create_function() (ab PHP 7.2) Ersatz ab PHP 5.3 durch anonyme Funktionen (closures) each() (ab PHP 7.2) Ersatz wäre foreach(), ist auch schneller Weitere Funktionen sind noch in Diskussion. (Stand: 10.02.2017) 8. 2
MIGRATIONSHINWEISE Migrationshinweise für Contao Erweiterungen 9. 1
Anpassung Abhängigkeiten Anpassung composer.json bzw. Einstellungen in ER2 auf Contao 3.5.5 bzw. 4.1.0 oder höher. 9. 2
String Klasse ersetzen Wurde die String Klasse aus dem Contao Core verwendet? Dann durch StringUtil ersetzen. Beispiele: String::toXhtml(...) zu StringUtil::toXhtml(...) Achtung: Die Methoden der String Klasse wurde vor längerer Zeit statisch. Die StringUtil Klasse verlor dabei die über üssig gewordene Methode "getinstance". Erweiterungen mit diesem Aufruf: $objstring = String::getInstance(); müssen da eventuell noch mehr anpassen. (z.b. die Erweiterung clipboard, siehe #14) 9. 3
Indirekte Variablen Wurde ein eigene Hook entwickelt? Der Aufruf der registrierten Klasse und Methode muss angepasst werden. $this->$callback[0]; zu $this->{$callback[0]}; $this->$callback[0]->$callback[1](...); zu $this->{$callback[0]}->{$callback[1]}(...); System::importStatic($callback[0])->$callback[1](); zu System::importStatic($callback[0])->{$callback[1]}(); 9. 4
TOOLS Tools um die Migration zu vereinfachen von PHP 5 auf PHP 7. 10. 1
PHP 7 Compatibility Checker (php7cc) Kommandozeilen-Tool, um die Migration von PHP 5.3-5.6 zu PHP 7 zu vereinfachen. Es sucht nach potenziell problematischen Anweisungen in bestehenden Code und erzeugt Berichte mit Dateinamen, Zeilennummern und kurze Problembeschreibungen. 10. 2
PHP 7 Compatibility Checker (php7cc) Ausgabe einer Prüfung: File: /system/modules/core/library/contao/string.php > Line 29: Reserved name "string" used as a class, interface or trait name class String { } Aber Achtung: Nicht gefunden wird derzeit so etwas: $value = \String::encodeEmail( $value); $xhtml = String::toXhtml( $html5); 10. 3
PHP 7 Compatibility Checker (php7cc) Ausgabe einer Prüfung: File: /system/modules/core/library/contao/database/mysql.php > Line 57: Removed function "mysql_connect" called mysql_connect($strhost, $dbuser, $dbpass); > Line 62: Removed function "mysql_query" called mysql_query('set sql_mode=\'\'', $this->resconnection);... 10. 4
PHP 7 Compatibility Checker (php7cc) Ausgabe einer Prüfung: File: /system/modules/core/modules/modulepersonaldata.php > Line 90: Indirect variable, property or method access $this->{$callback[0]}->{$callback[1]}(); Achtung! Hier wird bereits der korrigierte Quellcode ausgegeben. Die originale Zeile ist: $this->$callback[0]->$callback[1](); 10. 5
PHP 7 Compatibility Checker (php7cc) Weitere Informationen auf GitHub: sstalle/php7cc Installationen sind über Composer (global/lokal), als "phar" und als Docker Image möglich. 10. 6
PHP 7 Migration Assistant Report (MAR) Kommandozeilen-Tool, um die Migration von PHP 5.4-5.6 zu PHP 7 zu vereinfachen. Es sucht nach potenziell problematischen Anweisungen in bestehenden Code und erzeugt Berichte mit Dateinamen, Zeilennummern und kurze Problembeschreibungen. 10. 7
PHP 7 Migration Assistant Report (MAR) Ausgabe einer Prüfung: Report located at: /php7mar/reports/2016-08-18 22.59.28 String.md Darin im Markdown Format sind Meldungen dieser Art: critical /system/modules/core/library/contao/string.php * reservednames * Line 25: `class String` Aber Achtung: Nicht gefunden wird derzeit so etwas: $value = \String::encodeEmail( $value); $xhtml = String::toXhtml( $html5); 10. 8
PHP 7 Migration Assistant Report (MAR) Ausgabe einer Prüfung: Report located at: /php7mar/reports/2016-08-18 22.48.29 Mysql.md Darin im Markdown Format sind Meldungen dieser Art: critical /system/modules/core/library/contao/database/mysql.php * deprecatedfunctions * Line 47: @mysql_connect($strhost, $dbuser, $dbpass); * Line 51: @mysql_query("set sql_mode=''", $this->resconnection);... 10. 9
PHP 7 Migration Assistant Report (MAR) Ausgabe einer Prüfung: Report located at: /php7mar/reports/2016-08-18 22.33.08 ModulePersonalData.md Darin im Markdown Format sind Meldungen dieser Art: critical /system/modules/core/modules/modulepersonaldata.php * variableinterpolation * Line 72: ` $this->$callback[0]->$callback[1]();` 10. 10
PHP 7 Migration Assistant Report (MAR) Weitere Informationen auf GitHub: Alexia/php7mar Installationen sind über Composer und Download/Clone möglich. 10. 11
Static analyzer for PHP (Phan) Phan ist ein statischer Code-Analyzer, von Rasmus Lerdorf ins Leben gerufen, der problematische Code-Stellen aufdeckt. Die Prüfung auf PHP 5 / PHP 7 Kompatibilität ist dabei nur ein kleiner Teil der Tests. 10. 12
Static analyzer for PHP (Phan) Ausgabe einer Prüfung: (Contao 3.2.0 in.../core/)./classes/ajax.php:155 PhanTypeMismatchArgumentInternal Argument 1 (prefix) is int but \uniqid() takes string./classes/backend.php:432 PhanTypeMismatchReturn Returning type null but getbackendmodule() is declared to return string./library/contao/controller.php:794 PhanCompatiblePHP7 Expression may not be PHP 7 compatible./library/contao/user.php:246 PhanCompatiblePHP7 Expression may not be PHP 7 compatible Im Vergleich zu den beiden anderen Tools wird bezüglich PHP 7 sehr wenig gefunden, z.b. wurde die Klasse "String" nicht beanstandet. 10. 13
Static analyzer for PHP (Phan) Weitere Informationen auf GitHub: etsy/phan Installationen sind über Composer und Download/Clone möglich. Achtung: PHan benötigt selbst PHP 7 und die PHP Erweiterung "ast": nikic/php-ast 10. 14
Linkliste Informationen zur Migration: Migrating from PHP 5.6.x to PHP 7.0.x (php.net) Migrating from PHP 7.0.x to PHP 7.1.x (php.net) Mit PHP 7 wird das Internet schneller Reporting Tools für die Kommandozeile: PHP 7 Compatibility Checker - php7cc PHP 7 Migration Assistant Report (MAR) Static analyzer for PHP Interaktives Tutorial: php7-tutorial.com 11. 1
DANKE! Aktuelle Version dieser Folien auf: docs.contao.ninja (auch als PDF und später auch als Video) 12. 1