nouveautés php 7

Post on 29-Jul-2015

339 Views

Category:

Internet

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

cgrandval@darkmira.com

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/

top related