Download - Nouveautés php 7
Webday ESGI - 11 Juin 2015
Nouveautés PHP 7
Cyrille Grandval
Développeur PHP depuis + de 15 ans & Zend Evangelist (membre Z-Team)
Fondateur Darkmira et Darkmira Brasil
Professeur / Formateur PHP et Sécurité des applications Web
Co-auteur du livre « Préparation à la certification Zend Certified PHP Engineer -
ZCPE » aux éditions ENI
Twitter : @CyrilleGrandval
Roadmap
Support de PHP
Pourquoi PHP7 ?
Incompatibilités
Nouveautés
Testez votre code
Support PHP
http://php.net/supported-versions.php
Active support Security Fixes only End of life
Le 8 Juin 2015 - 20 ans de PHP !!
Timeline
Jusqu’au 15 MarsLister les RFC restantes dont l’objectif est d’être dans PHP7
16 Mars au 15 JuinFinaliser l’implémentation et les tests des nouvelles
fonctionnalités
16 Juin au 15 OctobreCycles de Release Candidate
…..
https://wiki.php.net/rfc/php7timeline
Sortie de PHP 7
Sortie de PHP 7Octobre 2015
Pourquoi PHP 7 ?
Un seul mot
PERFORMANCE
http://www.zend.com/en/resources/php7_infographic
Nouveau logo by Vincent Pontier
Vincent Pontierhttp://www.elroubio.net/Twitter : @Elroubio
Créateur de l’ElePHPanthttp://elephpant.com/
Incompatibilités
Peu de BC Break
Doit permettre de passer à PHP7 sans trop de
modifications
Incompatibilités
Suppression des fonctionnalités dépréciéeshttps://wiki.php.net/rfc/remove_deprecated_functionality_in_php7
Exemple
ext/mySQL (dépréciée depuis PHP5.5)-> utiliser PDO_MySQL ou MySQLi
ext/ereg (depuis PHP 5.3)-> utiliser ext/pcre
Incompatibilités
● Les constructeurs PHP4 sont maintenant dépréciés !
<?php
class IlEtaitTemps {
public function iletaittemps() { … }}
new IlEtaitTemps();
https://wiki.php.net/rfc/remove_php4_constructors
Petit rappel : Les constructeurs PHP4 ne sont déjà plus reconnus dans une classe d’un namespace
Incompatibilités
● Certains types sont devenus des mots clés réservés pour les noms de classes, traits et interfaces
● int● float● bool● string● true● false● null● resource● object● mixed● numeric
https://wiki.php.net/rfc/reserve_more_types_in_php_7https://wiki.php.net/rfc/reserve_even_more_types_in_php_7
<?php
class resource {
public function __construct() { … }}
new resource();
// Retourne une fatal erreur, Fatal error: "resource" cannot be used as a classname ...
Incompatibilités
● Suppression des ASP et script tags
<script language=”PHP”></script><% %><%= %>
● switch n’accepte plus plusieurs default
<?phpswitch ($expression) { default: echo 'Olá'; break; default: echo 'Tchau'; break;}
Retourne maintenant :
Fatal error: Switch statements may only contain one default clause
Incompatibilités
● Un octal invalide produit maintenant une erreur
PHP 5 PHP 7<?php$octale = 0148;echo $octale; // Affiche 12
<?php$octale = 0148;echo $octale;
// Fatal Error : Invalid numeric literal ….
● Les chaînes de caractères hexadécimales ne sont plus reconnues
PHP 5 PHP 7<?phpvar_dump(is_numeric('0x143'));// bool(true)
<?phpvar_dump(is_numeric('0x143'));// bool(false)
Incompatibilités
● Nouveau caractère \uPermet de spécifier un caractère Unicode et particulièrement UTF-8 (en hexadécimal)
<?php$unicode = "\u{265C};echo $unicode;
Incompatibilité car \u dans une double-quote ou HEREDOC existant sera considéré comme un caractère Unicode. Si celui-ci n’existe pas, une erreur fatale de compilation est levée
https://wiki.php.net/rfc/unicode_escape
Incompatibilités
● L’assignation du résultat d’un new par référence n’est plus possible
● La redéfinition d’un argument d’une fonction n’est plus possible
<?php$objet = &new stdclass;// Retourne une erreur de parser
<?phpfunction test($param, $valid, $valid) { … }// Retourne une erreur fatale : Fatal error: Redefinition of parameter $valid ….
Incompatibilités
● Les 2 fonctions func_get_arg et func_get_args retournent la valeur d’une variable dans le contexte local
PHP 5 PHP 7<?phpfunction samba($samba){ $samba++; echo func_get_arg(0); // Affiche 2}
samba(2);
<?phpfunction samba($samba){ $samba++; echo func_get_arg(0); // Affiche 3}
samba(2);
Désormais, la stacktrace d’exception affiche également les valeurs des variables dans le contexte local.
Uniforme Variable Syntax
https://wiki.php.net/rfc/uniform_variable_syntax
Une nouvelle syntaxe interne de variable a été introduite en PHP7.
Variables, propriétés et méthodes ne sont plus interpretées de la même manière. Maintenant interprété de gauche à droite.
Nouvelles possibilités / obligations comme :
● ($object->closureProperty)()● Enchaînement d’appels statiques $foo::$bar::$bat● global ${$foo->bar} au lieu de global $$foo->bar (global n’accepte plus que
des variables simples)
Scalar type hinting
PHP7 offre la possibilité de spécifier un type scalaire (string, integer, float, boolean) pour le type hinting
Activer en ajoutant declare(strict_types=1); en première instruction du fichier
<?phpdeclare(strict_types=1);
function test(int $param) { ….
return $param;}
echo test(1); // Affiche 1echo test("1"); // Fatal error: Argument 1 passed to test() must be of the type integer, string given, ….
Return type declaration
�https://wiki.php.net/rfc/return_types
Les méthodes constructeurs, destructeurs et clone ne peuvent pas déclarer de type de retour.
<?phpfunction test(): DateTime {
return 1; // Type de retour invalide}
● Possibilité de définir le type de retour attenduUne catchable fatal error est retournée si le type ne correspond pas
<?phpfunction test(): array {
return [0,1,2]; // Type de retour valide}
<?phpfunction test(): int {
return 1; // Type de retour invalide}
Catchable fatal error: Return value of test() must be an instance of int, integer returned in %s on line %d
Group use declaration
https://wiki.php.net/rfc/group_use_declarations
● Regroupement de déclaration use d’un namespace commun
PHP 5
PHP 7
<?phpuse Darkmira\Component\Security\ClassA;use Darkmira\Component\Security\ClassB;use Darkmira\Component\Bdd\ClassC;
<?phpuse Darkmira\Component\{ Security\ClassA, Security\ClassB, Bdd\ClassC};
Anonymous Class
�https://wiki.php.net/rfc/return_types
Même principe que les fonctions anonymes
PHP5 PHP7
<?phpclass Log { public function log ($msg) { … }}
$obj->setLog(new Log());
<?php$obj->setLog(new class { public function log ($msg) { … }});
Starship Operator
https://wiki.php.net/rfc/combined-comparison-operator
<?phpfunction order_func($a, $b) { return ($a < $b) ? -1 : (($a > $b) ? 1 : 0);}
<?phpfunction order_func($a, $b) { return $a <=> $b;}
Opérateur de comparaison (Combined Comparison Operator)
● identique aux fonctions strcmp() et version_compare()● mais peut comparer tous les types du moment qu’ils sont identiques de part et
d’autre de l’opérateur : chaînes, array, objets, ….
● Retourne 0 si égal● Retourne -1 si la valeur de gauche est inférieure● Retourne 1 si la valeur de droite est inférieure
PHP5 PHP7
Null Coalesce Operator
https://wiki.php.net/rfc/isset_ternary
● L’opérateur ?? retourne le résultat de l’opération de gauche si celui-ci n’est pas NULL sinon le résultat de l’opération de droite
PHP 5
PHP 7
<?php$name = ($_GET['name']) ? $_GET['name'] : 'default';
<?php$name = $_GET['name'] ?? 'default';
Ces opérateurs peuvent être enchaînés pour retourner le premier résultat non null d’un ensemble.
<?php$name = $_GET['name'] ?? $aBdd['name'] ?? 'default';
Exception Engine
https://wiki.php.net/rfc/engine_exceptions_for_php7
● Possibilité d’attraper les erreurs fatales au travers d’exception○ si non attrapée, une erreur fatale “normale” est retournée
<?phptry { test();} catch (\EngineException $e) { echo $e->getMessage();} final { // Exécuté malgré l’erreur fatale}
Plusieurs erreurs de parsing (spécialement avec eval) peuvent être attrapées à l’aide de la classe ParseException.
Exception Engine
● Nouveau schéma d’exception de PHP7
BaseException- EngineException
- TypeException- ParseException- Exception (déjà présente en PHP5)
Enorme gain de performances
+Peu de BC Break
=Migration assurée et rapide
Testez votre code
Vous pouvez déjà tester vos applications !!
● Build PHP7 fourni par ZendInstallation packages for Ubuntu 14.04 and CentOS 7 (and compatible distros), Dockerfile for Docker, Tarballs for Ubuntu and CentOShttp://php7.zend.com/
● php7dev de Rasmus Lerdorf VM Debian8 préconfiguré avec plusieurs versions de PHP dont PHP7https://github.com/rlerdorf/php7dev
● Build VM easily with PuPHPethttp://www.sitepoint.com/build-virtual-machines-easily-puphpet/