Glen Langer Contao Camp 2016 in Nürnberg Version: vom (Bild: PHP.net)

Ähnliche Dokumente
Hochschule Darmstadt Fachbereich Informatik

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete! 4. Ausnahmen (Exceptions) II.4.

Java I Vorlesung 6 Referenz-Datentypen

Programmieren I. Fehlerbehandlung Exceptions. Heusch 2. Bd, 3 Ratz 10. Institut für Angewandte Informatik

Exceptions und Vererbung

Dynamische Webseiten mit PHP. Oder: LAMP - The open way

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Klausur Grundlagen der Programmierung

Neue Features in C# 2.0

Ausnahmebehandlung. Ausnahmen werfen (auslösen) Eigene Ausnahmen definieren. Ausnahmen abfangen. Ausnahmen definieren

SmallTalk - Eine kurze Einführung

string: Beispiele: Test, test, `Seitentitel: ${document.title}`

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

Tag 4 Repetitorium Informatik (Java)

Einstieg in die Informatik mit Java

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Multimedia im Netz Wintersemester 2011/12

Grundlagen der Fehlerbehandlung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 06: Ausnahme- und Fehlerbehandlung in Java.

Einführung in ActionScript

Programmierkurs Java

Web-Techniken Einführung in JavaScript

C++11. neu in C++11: range-based for. Objektorientierte Programmierung mit C++ Ersetzung durch: 1. Elementares C++ int array[] = { 1, 2, 3, 4, 5 };

Programmieren in Java -Eingangstest-

Exkurs: ANONYME KLASSEN. Techniken der Programmentwicklung Prof. Dr. Wolfgang Schramm

Deklaration einer Klasse Innere innerhalb Klassen einer in Ja anderen v a Klasse

Java Tools JDK. IDEs. Downloads. Eclipse. IntelliJ. NetBeans. Java SE 8 Java SE 8 Documentation

Algorithmen und Datenstrukturen

Methoden und Wrapperklassen

Programmieren von Webinformationssystemen

Ausnahmen. Exceptions. Definition Ausnahmen erzeugen Ausnahmen abfangen Ausnahmen weiterleiten. Dr. Beatrice Amrhein

Kapitel 13. Abstrakte Methoden und Interfaces. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

<body> <h1>testseite für HTML-Parameter-Übergabe<br>50 Parameter werden übergeben</h1>

Übung zur Vorlesung Multimedia im Netz

Programmieren von Webinformationssystemen

Closures in Java. Michael Wiedeking. Java Forum Stuttgart Juli MATHEMA Software GmbH (

Methoden (fortgeschritten) in C# - 1

Fragenkatalog ESOP WS 16/17

Distributed Computing Group

Anweisungen zur Ablaufsteuerung

PHP-Autoloading ohne Fehler-Kontroll-Operator

Java-Schulung Grundlagen

Unified-E Standard WebHttp Adapter

C# - Einführung in die Programmiersprache Methoden. Leibniz Universität IT Services

Java I Vorlesung Generics und Packages

Die Klasse Collection (gb) implementiert eine Hash-Tabelle, deren Elemente aus einem Wert-Schlüssel-Paar

Verarbeitung unendlicher Datenstrukturen Jetzt können wir z.b. die unendliche Liste aller geraden Zahlen oder aller Quadratzahlen berechnen:

Programmentwicklung ohne BlueJ

Objektorientierung: Klassen und Objekte

Funktionales Programmieren mit objektorientierten Sprachen

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 14/15. Kapitel 11. Fehler und Ausnahmen 1

Einführung in die Programmierung I. 2.0 Einfache Java Programme. Thomas R. Gross. Department Informatik ETH Zürich

Klassen und Objekte. Einführung in Java. Folie 1 von Mai Ivo Kronenberg

Tel PHP-Coding-Guidelines PHP Coding-Guidelines 1. Ausgabe Oktober 2012

Gliederung Grundlagen Schlüsselworte try-catch Fehlerobjekte Fehlerklassen Schlüsselwort finally Schlüsselwort throws selbst erstellte Exceptions

Gebundene Typparameter

System.out.println("TEXT");

Universität Karlsruhe (TH)

C++ - Einführung in die Programmiersprache Fehler abfangen. Leibniz Universität IT Services Anja Aue

1 Fehler-Objekte: Werfen, Fangen, Behandeln

Vererbung und Polymorphie

Schlussendlich geben wir die Listen aus. Es kommt zu folgender Ausgabe:

Team Developer 6.3.NET

Wie kann man es verhindern das Rad immer wieder erneut erfinden zu müssen?

Verschlüsseln eines Bildes. Visuelle Kryptographie. Verschlüsseln eines Bildes. Verschlüsseln eines Bildes

Einstieg in die Informatik mit Java

Short Introduction to C# C# (C SHARP) Microsofts Antwort auf Java

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren

Große Übung Praktische Informatik 1

Exceptions. CoMa-Übung VII TU Berlin. CoMa-Übung VII (TU Berlin) Exceptions / 1

Ich liebe Java && Ich liebe C# Rolf Borst

Stack stack = new Stack(); stack.push ("Würstchen"); string s = (string) stack.pop(); Console.WriteLine (s);

DAP2-Programmierpraktikum Einführung in C++ (Teil 2)

AuD-Tafelübung T-B5b

Programmieren I. Kapitel 10. Spezielle Features

Javakurs zu Informatik I. Henning Heitkötter

Grundlagen der Programmierung Prof. H. Mössenböck. 16. Ausnahmen (Exception Handling)

Einführung in Javadoc

Übungsstunde 10. Einführung in die Programmierung I

Neue Wege mit Contao 4

Einführung in die Informatik 1

Java: Eine kurze Einführung an Beispielen

DOM Document Object Model

Institut für Programmierung und Reaktive Systeme. Java 3. Markus Reschke

Klassenbeziehungen & Vererbung

1 Organisatorisches. 2 Compilezeit- und Laufzeitfehler. 3 Exceptions. 4 Try-Catch-Finally

1 Polymorphie (Vielgestaltigkeit)

C++ Teil 9. Sven Groß. 17. Juni Sven Groß (IGPM, RWTH Aachen) C++ Teil Juni / 17

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Modul 122 VBA Scribt.docx

Vorlesung Objektorientierte Programmierung Klausur

Kapitel 10. Programmierkurs. Grundlagen von Exceptions Behandlung von Exceptions

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Klausur Fachprüfung Wirtschaftsinformatik Dauer: 2 Stunden. Name:

Objects First With Java A Practical Introduction Using BlueJ. Mehr über Vererbung. Exploring polymorphism 1.0

3. Übungsbesprechung Programmkonstruktion

C++ Teil 12. Sven Groß. 18. Jan Sven Groß (IGPM, RWTH Aachen) C++ Teil Jan / 11

Variablen. int Flugzeug. float. I write code Hund. String. long. Borchers: Programmierung für Alle (Java), WS 06/07 Kapitel

Einführung Datentypen Verzweigung Schleifen. Java Crashkurs. Kim-Manuel Klein May 4, 2015

Repetitorium Informatik (Java)

Transkript:

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