Les nouveautés de PHP 7.1

Clermont'ech - 7 Novembre 2016

Kevin Gautreau / contact@kgaut.net / @kgaut

$ whois

Kevin Gautreau

  • Développeur backoffice freelance
  • Spécialisé Drupal 7 & 8
  • Formateur
  • Twitter / Github / * : @kgaut
  • Site : https://kgaut.net

Un petit historique

PHP: Hypertext Preprocessor

  • Créé par Rasmus Lerdorf (1994) PHP/FI
  • Core réécrit par Zeev Suraski et Andi Gutmans (PHP 3 puis 4)
  • Licence Libre

PHP 6 : la bonne blague

  • Objectif : Support de l'unicode (UTF-16)
  • Démarrée en 2005
  • Longtemps retardé
  • Sortie de PHP 5.3 en 2009
  • Finalement annulé en 2010
  • Préparation de PHP 5.4 en 2010 (sortie en 2012)

PHP 7 : Une version majeure

  • Grosse amélioration des performances
  • Ménage dans les relicats de vieilles versions de php
  • Nouveaux opérateurs ?? <=>...

PHP : Cycle de développement

  • 1 version mineure par an
  • Compatibilité assendante entre les version mineures
  • Démocratie par RFC

PHP 7.1

  • RC5 sortie le 27/10/2016
  • RC6 sortie le 10/11/2016
  • Finale? sortie le 2*/11/2016

Le typage

Amené par PHP 7.0


function ma_fonction(int $monEntier) {
	echo $monEntier;
}

						

Probleme : impossible de passer "null"

ma_fonction(null);=> error

Nullable Types

Opérateur "?"

?int ?string


function ma_fonction(?int $monEntier) {
  if(is_null($monEntier)) {
    echo 'pas de nombre 
'; } echo $monEntier.'
'; } ma_fonction(null);

Nullable Types - Return


function mon_carre(?int $monEntier) : ?int {
  if(is_null($monEntier)) {
    return null;
  }
  return $monEntier*$monEntier;
}

						

Types - Return void


function ma_fonction_qui_retourne_rien() : void {
	// Si "return quelque chose" => Fatal Error
}

						

Les Exceptions

class Lorem extends Exception {}
class Ipsum extends Exception {}
class Dolores extends Exception {}

try {
  switch (mt_rand(1, 3)) {
    case 1: throw new Lorem();
    case 2: throw new Ipsum();
    case 3: throw new Dolores();
  }
}
catch (Lorem | Ipsum $e) {
  printf("1er catch : %s\n", get_class($e));
}
catch (Dolores $e) {
  printf("2nd catch : %s\n", get_class($e));
}

						

Try/Catch des fatal error

try {
  //Code qui déclenche une fatal error
}
catch (Error $e) {
  print 'Erreur : '. $e->getMessage();
}

						

Try/Catch des fatal error

Exemple : code

$serialized = 'O:8:"DateTime":3:{s:4:"date";s:26:"2016-08-14 12:31:50.000000";s:13:"timezone-type";i:3;s:8:"timezone";s:3:"UTC";}';
try {
  $dt = unserialize($serialized);
}
catch (Error $e) {
  //Théoriquement ici je log quelque chose
}
print "

je suis là

";

Try/Catch des fatal error

Exemple : Résultat

php 7.0

php 7.1

En vrac

Les tableaux de String

$string = "hello world";

echo($string[4].'
'); //=>"o" echo($string[-2].'
'); //=>"l" $string[-4] = 'a'; echo($string.'
'); //=>"hello warld"

En vrac

Deprecation de mcrypt

  • E_DEPRECATED en php 7.1
  • Suppression en php 8 ?

Tester PHP 7.1 ?

  • Via la compilation
  • Via docker (image php:7.1.0RC5-apache)

Exemple docker-compose

./docker-compose.yaml


version: "2"
services:
  web:
    image: php:7.1.0RC5-apache
    ports:
      - 3012:80
    volumes:
      - ./www:/var/www/html
						

Exemple docker-compose

./www/index.php
phpinfo();
$ docker-compose up

http://127.0.0.1:3012

Exemple docker-compose

./docker-compose.yaml
version: "2"
services:
  php70:
    image: php:7.0-apache
    ports:
      - 3070:80
    volumes:
      - ./php-test:/var/www/html

  php71:
    image: php:7.1.0RC5-apache
    ports:
      - 3071:80
    volumes:
      - ./php-test:/var/www/html

Merci

  • Kevin Gautreau
  • Mail : contact@kgaut.net
  • Twitter / Github / * : @kgaut
  • Site : https://kgaut.net