Présentation PHP 7

En bref :

Aperçu des nouvelles fonctionnalités

? pour l'aide
crazy-max
Developer Enthusiast
2017-02-13
Présentation PHP 7: Aperçu des nouvelles fonctionnalités by crazy-max
Licensed under the MIT License | https://github.com/crazy-max/php7-presentation
Powered by reveal.js and Jekyll 3.7.2
## Agenda - Timeline - Passer à PHP 7 ? - Checklist de migration - Pourquoi PDO ? - Nouveautés - PHP 7.1 - Tester une migration à PHP 7 - Symfony - Des questions ?
# Timeline

Timeline
*Source : https://fr.wikipedia.org/wiki/PHP*

Timeline
*Source : http://php.net/supported-versions.php*

Passer à PHP 7 ?

Passer à PHP 7 ?

PHP 5

est maintenant âgé de 13 ans

+
PHP 7

est assez mature

Passer à PHP 7 ?

**De meilleures performances grâce à PHPNG** (PHP Next Generation)

=

**à Facebook HHVM** (HipHop Virtual Machine)

Plus d'infos sur le bench : http://talks.php.net/oz15#/drupalbench
Passer à PHP 7 ?
*Source : https://www.zend.com*

Passer à PHP 7 ?
*Source : https://www.zend.com*

Passer à PHP 7 ?
*Source : https://twitter.com/andygrunwald/status/735515546033262592*

Passer à PHP 7 ?

Quelques cas d'étude

* [Badoo qui a préservé 1 million de dollars](https://techblog.badoo.com/blog/2016/03/14/how-badoo-saved-one-million-dollars-switching-to-php7/) en passant à PHP 7 * [Tumblr qui a réduit sa latence et charge CPU de moitié](https://engineering.tumblr.com/post/152998126990/php-7-at-tumblr) * [Dailymotion qui gère deux fois plus de traffic](http://engineering.dailymotion.com/php-7-deployment-at-dailymotion/) avec la même infrastructure en passant à PHP 7.

PHP 6 ?

Prise en charge de l'Unicode au coeur du langage.
Non publié, le projet a été abandonné.
Plus d'infos : https://wiki.php.net/rfc/php6

Checklist de migration

Checklist de migration

Suppression des fonctionnalités dépréciées

https://wiki.php.net/rfc/remove_deprecated_functionality_in_php7
mysql_* < MySQLi < PDO
ereg* < pcre
Checklist de migration

Directives INI supprimées

  • always_populate_raw_post_data
  • asp_tags
Checklist de migration
## Constructeurs PHP 4 dépréciés ````php class Filter { public function filter() { ... } } new Filter(); ```` https://wiki.php.net/rfc/remove_php4_constructors
Checklist de migration
## Mots clés réservés supplémentaires `bool`, `int`, `float`, `string`, `resource`, ...
````php class resource { public function __construct() { ... } } new resource(); ````
````text Fatal error: "resource" cannot be used as a classname. ````
https://wiki.php.net/rfc/reserve_more_types_in_php_7 https://wiki.php.net/rfc/reserve_even_more_types_in_php_7
Checklist de migration
## "default" unique pour switch ````php switch($expr) { default:     neverExecuted();     break; default:     executed(); } ````
````text Fatal error: Switch statements may only contain one default clause. ````
## Pourquoi PDO ?

Pourquoi PDO ?

Flexibilité des vendors

  • PostgreSQL
  • SQLite
  • MySQL
  • Oracle
  • ODBC
  • MS SQLServer & Azure
  • Firebird
  • Informix
  • IBM DB2
  • Sybase
  • Cubrid
  • 4D
Pourquoi PDO ?

Facilité d'installation

##### Debian (via Dotdeb repository) ````text sudo apt-get install php7.0-mysql ```` ##### CentOS / RHEL (via Remi repository) ````text sudo yum install php-pdo php-mysql ```` ##### Neard : activé par défaut
Pourquoi PDO ?

Méthode de connexion unifiée et standard

````php // MySQL $dbh = new PDO("mysql:host=$host;dbname=$dbname, $user, $pass"); // MSSQL $dbh = new PDO("mssql:host=$host;dbname=$dbname, $user, $pass"); // Sybase $dbh = new PDO("sybase:host=$host;dbname=$dbname, $user, $pass"); // SQLite $dbh = new PDO("sqlite:my/database/path/database.db"); ````
Pourquoi PDO ?

Prepared statements pour se protéger des injections

````php // No placeholders $sth = $dbh->prepare("INSERT INTO users (name, email) VALUES ($name, $email)"); // Unnamed placeholders $sth = $dbh->prepare("INSERT INTO users (name, email) VALUES (?, ?)"); $sth->bindParam(1, $name); $sth->bindParam(2, $email); // Named placeholders $sth = $dbh->prepare("INSERT INTO users (name, email) VALUES (:name, :email)"); $sth->bindParam(':name', $name); $sth->bindParam(':email', $email); // Execute $sth->execute(); ````
Pourquoi PDO ?
##### Pour plus d'infos je vous invite à lire cet article : https://code.tutsplus.com/tutorials/why-you-should-be-using-phps-pdo-for-database-access--net-12059
# Nouveautés

Nouveautés

Types scalaires pour les paramètres

##### Types scalaires `bool`, `int`, `float`, `string`.
##### Typehint ````php function formatDateInFrench(DateTime $date) { return $date->format('d/m/Y'); } ````
Nouveautés

Null coalesce operator

````php // Before $username = isset($_GET['user']) ? $_GET['user'] : 'nobody'; ````
````php // After $username = $_GET['user'] ?? 'nobody'; ````
Nouveautés

Spaceship operator

````php // Before function foo($a ,$b) { if ($a == $b) {     return 0; } elseif ($a > $b) {     return -1; } elseif ($b > $a) {     return 1; } } ````
````php // After function foo($a ,$b) { return $a <=> $b; } ````
Nouveautés

Type de retour

````php // After function isValidStatusCode(int $statusCode): bool { return isset($this->statuses[$statusCode]); } ````
Nouveautés

Typage strict

````php declare(strict_types=1); function add(int $a, int $b) { return $a + $b; } add(10, '20'); ````
````text Fatal error: Uncaught TypeError:     Argument 2 passed to add()     must be of the type integer, string given ````
Nouveautés

Classes anonymes

````php // Before class Logger { public function log($msg) { echo $msg; } } $util->setLogger(new Logger()); ````
````php // After $util->setLogger(new class { public function log($msg) { echo $msg; } }); ````
Nouveautés

Améliorations sur la gestion des erreurs

* Erreurs fatales internes → exceptions * Hiérarchie d'erreurs / exceptions
Nouveautés

Erreurs fatales internes → exceptions

````php $obj = null; try { // Ooops ! $obj->methode(); } catch (Error $e) { var_dump($e>getMessage()); } ````
````text string(43) "Call to a member function methode() on null" ````
Nouveautés

Hiérarchie d'erreurs / exceptions

````text interface Throwable     Exception implements Throwable       // Toutes les exceptions usuelles     Error implements Throwable       AssertionError extends Error       ParseError extends Error       TypeError extends Error ````
Nouveautés

Plus d'infos : http://php.net/manual/fr/migration70.new-features.php
# PHP 7.1

PHP 7.1
##### Visibilité des constantes de classe ````php class Foo { public const PUB_BAR = 42; private const PRIV_BAR = 1234; public function bar() {     var_dump(self::PRIV_BAR); } } ````
PHP 7.1
##### Type de retour "void" ````php function noReturn(): void { // Valid } function nothing(): void { return; // Valid too! } function outch(void $foo) { // Fatal error. } function returnNull(): void { return null; // Fatal error. } ````
PHP 7.1
##### Types "nullable"
````php function response1(): ?int { return null; // OK } function response2(): ?int { return 42; // OK } ````
````php function response3(): ?int { return new stdClass; // ERROR } // Le paramètre doit valoir un string ou être null function dire(?string $message) { if ($message) {     echo $message; } } ````
## Tester une migration à PHP 7

Tester une migration à PHP 7

php7cc

  • Outil en CLI
  • Installation par Phar, Composer ou Docker
Plus d'infos : https://github.com/sstalle/php7cc
# Symfony

Symfony

Symfony

Symfony
Dans ces versions compatibles avec PHP 7, des fonctions obsolètes ont été supprimées et la version minimum de PHP est désormais passée de 5.5 à 5.6.
Symfony

## Changements * Signatures de méthode * Redéfinition de classes et méthodes * Adaptation aux nouvelles normes PSR (php-fig.org) * Modification de la structure des fichiers

Symfony

## Rappel sur les normes PSR > PSR : Propose a Standards Recommendation * PSR-0 : Chargement des classes PHP et autoloading * PSR-1 : Conventions minimales de codage * PSR-2 : Style et l'organisation du code * PSR-3 : S'occupe de l'interface des loggers * PSR-4 : Nouveau standard d'autoloading * ... *Source : http://www.php-fig.org/psr/*

Merci pour votre attention !
Des questions ?