nouveautés php 7

29
Webday ESGI - 11 Juin 2015 Nouveautés PHP 7

Upload: cyrille-grandval

Post on 29-Jul-2015

339 views

Category:

Internet


0 download

TRANSCRIPT

Page 1: Nouveautés php 7

Webday ESGI - 11 Juin 2015

Nouveautés PHP 7

Page 2: 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

[email protected]

Twitter : @CyrilleGrandval

Page 3: Nouveautés php 7

Roadmap

Support de PHP

Pourquoi PHP7 ?

Incompatibilités

Nouveautés

Testez votre code

Page 4: Nouveautés php 7

Support PHP

http://php.net/supported-versions.php

Active support Security Fixes only End of life

Page 5: Nouveautés php 7

Le 8 Juin 2015 - 20 ans de PHP !!

Page 6: Nouveautés php 7

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

Page 7: Nouveautés php 7

Sortie de PHP 7

Sortie de PHP 7Octobre 2015

Page 8: Nouveautés php 7

Pourquoi PHP 7 ?

Un seul mot

PERFORMANCE

http://www.zend.com/en/resources/php7_infographic

Page 9: Nouveautés php 7

Nouveau logo by Vincent Pontier

Vincent Pontierhttp://www.elroubio.net/Twitter : @Elroubio

Créateur de l’ElePHPanthttp://elephpant.com/

Page 10: Nouveautés php 7

Incompatibilités

Peu de BC Break

Doit permettre de passer à PHP7 sans trop de

modifications

Page 11: Nouveautés php 7

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

Page 12: Nouveautés php 7

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

Page 13: Nouveautés php 7

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

Page 14: Nouveautés php 7

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

Page 15: Nouveautés php 7

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)

Page 16: Nouveautés php 7

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

Page 17: Nouveautés php 7

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 ….

Page 18: Nouveautés php 7

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.

Page 19: Nouveautés php 7

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)

Page 20: Nouveautés php 7

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, ….

Page 21: Nouveautés php 7

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

Page 22: Nouveautés php 7

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};

Page 23: Nouveautés php 7

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) { … }});

Page 24: Nouveautés php 7

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

Page 25: Nouveautés php 7

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';

Page 26: Nouveautés php 7

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.

Page 27: Nouveautés php 7

Exception Engine

● Nouveau schéma d’exception de PHP7

BaseException- EngineException

- TypeException- ParseException- Exception (déjà présente en PHP5)

Page 28: Nouveautés php 7

Enorme gain de performances

+Peu de BC Break

=Migration assurée et rapide

Page 29: Nouveautés php 7

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/