Conférence d'ouverture du deuxième webday de l'esgi.
Présentation des nouveautés de PHP7, l'état du support des versions de PHP, les incompatibilités (backwards compatibility breaks), les nouvelles fonctionnalités, et les moyens pour tester son application dès maintenant.
2. 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
6. Timeline
Jusqu’au 15 Mars
Lister les RFC restantes dont l’objectif est d’être dans PHP7
16 Mars au 15 Juin
Finaliser l’implémentation et les tests des nouvelles
fonctionnalités
16 Juin au 15 Octobre
Cycles de Release Candidate
…..
https://wiki.php.net/rfc/php7timeline
11. Incompatibilités
Suppression des fonctionnalités dépréciées
https://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
12. 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
13. 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_7
https://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
...
14. Incompatibilités
● Suppression des ASP et script tags
<script language=”PHP”></script>
<% %>
<%= %>
● switch n’accepte plus plusieurs default
<?php
switch ($expression) {
default:
echo 'Olá';
break;
default:
echo 'Tchau';
break;
}
Retourne maintenant :
Fatal error: Switch statements may
only contain one default clause
15. 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
<?php
var_dump(is_numeric('0x143'));
// bool(true)
<?php
var_dump(is_numeric('0x143'));
// bool(false)
16. Incompatibilités
● Nouveau caractère u
Permet 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
17. 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
<?php
function test($param, $valid, $valid) { … }
// Retourne une erreur fatale : Fatal error: Redefinition of
parameter $valid ….
18. 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
<?php
function samba($samba)
{
$samba++;
echo func_get_arg(0); // Affiche 2
}
samba(2);
<?php
function 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.
19. 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)
20. 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
<?php
declare(strict_types=1);
function test(int $param) {
….
return $param;
}
echo test(1); // Affiche 1
echo test("1"); // Fatal error: Argument 1 passed to test() must be of
the type integer, string given, ….
21. 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.
<?php
function test(): DateTime {
return 1; // Type de retour invalide
}
● Possibilité de définir le type de retour attendu
Une catchable fatal error est retournée si le type ne correspond pas
<?php
function test(): array {
return [0,1,2]; // Type de retour
valide
}
<?php
function 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
22. Group use declaration
https://wiki.php.net/rfc/group_use_declarations
● Regroupement de déclaration use d’un namespace commun
PHP 5
PHP 7
<?php
use DarkmiraComponentSecurityClassA;
use DarkmiraComponentSecurityClassB;
use DarkmiraComponentBddClassC;
<?php
use DarkmiraComponent{
SecurityClassA,
SecurityClassB,
BddClassC
};
24. Starship Operator
https://wiki.php.net/rfc/combined-comparison-operator
<?php
function order_func($a, $b) {
return ($a < $b) ? -1 : (($a > $b) ?
1 : 0);
}
<?php
function 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
25. 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';
26. 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
<?php
try {
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.
27. Exception Engine
● Nouveau schéma d’exception de PHP7
BaseException
- EngineException
- TypeException
- ParseException
- Exception (déjà présente en PHP5)
29. Testez votre code
Vous pouvez déjà tester vos applications !!
● Build PHP7 fourni par Zend
Installation packages for Ubuntu 14.04 and CentOS 7 (and compatible
distros), Dockerfile for Docker, Tarballs for Ubuntu and CentOS
http://php7.zend.com/
● php7dev de Rasmus Lerdorf
VM Debian8 préconfiguré avec plusieurs versions de PHP dont PHP7
https://github.com/rlerdorf/php7dev
● Build VM easily with PuPHPet
http://www.sitepoint.com/build-virtual-machines-easily-puphpet/