NouveautĂ©s de PHP 7.3 🐘

Pendant que la nouvelle version de PHP est en préparation pour le 13 décembre 2018, découvrons ensemble les nouveautés de PHP 7.3 à travers la derniÚre BETA sortie le 30 août 2018.

Environnement de test

Avant de commencer, nous allons voir rapidement comment tester diffĂ©rentes versions de PHP. Voyons comment installer parallĂšlement PHP 7.3 et PHP 7.2 (qui nous servira de rĂ©fĂ©rence). La procĂ©dure ci-dessous a Ă©tĂ© faite sous Windows pour le plus grand nombre mais peut ĂȘtre menĂ©e sous Linux ou MacOS.

Nous allons ensuite extraire chaque archive dans un dossier différent :

  • CrĂ©er un dossier /PHP7.2/ pour y placer le contenu de l’archive PHP 7.2.10 RC1
  • CrĂ©er un dossier /PHP7.3/ pour y placer le contenu de l’archive PHP 7.3 BETA 3
  • CrĂ©er un dossier /src/ dans lequel vous pouvez mettre vos scripts de test.

Nous pouvons maintenant dĂ©marrer notre serveur de test PHP 7.2 grĂące au serveur web intĂ©grĂ© Ă  PHP. Dans l’invite de commande, lançons un premier serveur web sur http://localhost:8072

\PHP7.2\php.exe -t src\ -S localhost:8072

Lançons un serveur de test PHP 7.3 sur un numĂ©ro de port diffĂ©rent dans une seconde invite de commande. Le serveur PHP 7.3 sera accessible Ă  l’adresse http://localhost:8073

\PHP7.3\php.exe -t src\ -S localhost:8073

Nous sommes maintenant prÚs à dépiler les fonctionnalités décrites dans les RFC de PHP 7.3 : https://wiki.php.net/rfc#php_73

Syntaxes Heredoc et Nowdoc plus flexibles

RFC : https://wiki.php.net/rfc/flexible_heredoc_nowdoc_syntaxes
Documentation : http://php.net/manual/fr/language.types.string.php#language.types.string.syntax.heredoc

En PHP, il existe de nombreuses maniĂšres de dĂ©clarer des chaines de caractĂšres, des string . Vous connaissez les apostrophes simples, les doubles apostrophes, mais connaissez-vous les syntaxes Heredoc et Nowdoc ? Ces syntaxes un peu plus lourde que l’apostrophe vous Ă©vitent justement d’avoir Ă  Ă©chapper les apostrophes et sont particuliĂšrement adaptĂ©es aux chaines sur plusieurs lignes . Toutefois, leur syntaxe particuliĂšre peuvent en dĂ©router quelques-uns, prenons l’exemple avec heredoc :

class Query
{
	public $sql = <<<SQL
		SELECT *
		FROM User
		WHERE name = 'Joe';
SQL;
}

Dans l’exemple prĂ©cĂ©dent, on peut voir que l’opĂ©rateur <<< est suivi d’un identifiant, j’ai choisi SQL. Pour fermer la chaine, jusqu’en PHP 7.2, vous deviez Ă©crire l’identifiant Ă  la ligne (collĂ© Ă  gauche). Heureusement, cette syntaxe gagne en flexibilitĂ© avec PHP 7.3 et permet d’indenter l’identifiant de fin.

class Query
{
	public $sql = <<<SQL
		SELECT *
		FROM User
		WHERE name = 'Joe';
	SQL;
}

Virgule de fin dans l’appel de fonction autorisĂ©e

RFC : https://wiki.php.net/rfc/trailing-comma-function-calls

En PHP, il est possible de laisser trainer une virgule à la fin de la liste des éléments dans un Array
PHP 7,2 étendait cette possibilité aux espaces de noms groupés

use Framework\Component\{
    Email,
    Console,
    Log,
};

GrĂące Ă  PHP 7.3, il est maintenant possible d’utiliser cette syntaxe lors de l’appel d’une fonction. La virgule de fin qui gĂ©nĂ©rait une erreur en PHP 7.2 est valide en PHP 7.3.

var_dump(
    'CODE',
    'DESIGN',
);

Configurer l’extension JSON pour lancer une exception en cas d’erreur

RFC : https://wiki.php.net/rfc/json_throw_on_error
Documentation : http://php.net/manual/fr/function.json-decode.php

Avec PHP 7.2, la fonction json_decode() retournait NULL en cas d’erreur ce qui pouvait porter Ă  confusion car NULL peut Ă©galement ĂȘtre une valeur valide. Il Ă©tait d’ailleurs possible de rĂ©cupĂ©rer l’erreur avec les fonctions json_last_error() et json_last_error_msg().

Depuis PHP 7.3, la flag JSON_THROW_ON_ERROR permet de modifier la gestion d’erreur des fonctions JSON en envoyant une exception de type JsonException pouvant ĂȘtre gĂ©rĂ©e dans un try{} catch{}.

$json = '{"title":"code|design.fr"}s';

try {
    $title = json_decode($json, false, 512, JSON_THROW_ON_ERROR);
} catch (JsonException $exception) {
    echo $exception->getMessage();
}

Affectation par référence avec la fonction list()

RFC : https://wiki.php.net/rfc/list_reference_assignment
Documentation : http://php.net/manual/fr/function.list.php, http://php.net/manual/fr/language.references.php

En PHP, une rĂ©fĂ©rence est une maniĂšre d’accĂ©der au contenu d’une variable en utilisant diffĂ©rent noms. Par dĂ©faut, l’affectation d’une instance d’un objet en PHP se fait par rĂ©fĂ©rence tandis que l’affectation d’une chaine de caractĂšres se fait par copie. Pour forcer le passage par rĂ©fĂ©rence d’une chaine de caractĂšre, il faut prĂ©fixer la variable par  &.

Toutefois, avec PHP 7.2, il n’Ă©tait pas possible d’Ă©clater les valeurs d’un tableau avec la fonction list() pour les rĂ©cupĂ©rer par rĂ©fĂ©rence. C’est maintenant possible avec PHP 7.3.

$languages = ['PHP', 'JAVA', 'SQL'];

// Affecte chaque valeur du tableau à une variable par référence
list(&$a, &$b, &$c) = $languages;

// Modifie $b par référence
$b = 'JavaScript';

// Affiche les valeurs du tableau initial
print_r($languages); // Array ( [0] => PHP [1] => JavaScript [2] => SQL )

Nouvelle fonction is_countable()

RFC : https://wiki.php.net/rfc/is-countable
Documentation : http://php.net/manual/fr/function.is-countable.php

La fonction count() renvoie une erreur si le paramĂštre qui lui est passĂ© n’est pas Ă©numĂ©rable. En PHP 7.3, la fonction is_countable() fait son apparition afin de vĂ©rifier que la valeur est Ă©numĂ©rable avant de rĂ©aliser un comptage.

$instance = new stdClass();

if(is_countable($instance)){
    $size = count($instance);
}

Nouvelles fonction array_key_first() et array_key_last()

RFC : https://wiki.php.net/rfc/array_key_first_last
Documentation : http://php.net/manual/fr/function.array-key-first.php, http://php.net/manual/fr/function.array-key-last.php

En PHP 7.2, pour rĂ©cupĂ©rer la premiĂšre ou derniĂšre clĂ© d’un tableau, vous deviez enchainer plusieurs fonctions de manipulation de tableau tel que  key(), reset() ou autre hack.

PHP 7.3 introduit deux nouvelles fonctions array_key_first() et array_key_last().

$languages = [
   7 => 'PHP',
   14 => 'HTML',
   22 => 'CSS'
];
// RĂ©cupĂšre l'ID du 1er langage de la liste
$firstLanguageKey = array_key_first($languages);

var_dump($firstLanguageKey); // int(1) 7

AmĂ©lioration de l’algorithme de hachage Argon2 avec l’ajout de Argon2id

RFC : https://wiki.php.net/rfc/argon2_password_hash_enhancements
Documentation : http://php.net/manual/fr/function.password-hash.php, http://php.net/manual/fr/password.constants.php

PHP fourni toute une panoplie de fonction de cryptographie dont certaines sont spécifiques au hachage de mot de passe.

Depuis PHP 5.5, la fonction password_hash() permet de « sĂ©curisé » un mot de passe en le transformant de telle sorte que l’on puisse continuer de le vĂ©rifier avec password_verify() sans jamais pouvoir en retrouver sa valeur d’origine.

Pour utiliser ces fonctions de hachage, vous devez choisir un algorithme Ă  utiliser. Chaque algorithme Ă  des spĂ©cificitĂ©s comme leur vitesse d’exĂ©cution et leur niveau de sĂ©curitĂ©. Par dĂ©faut, la constante 
PASSWORD_DEFAULT permet de choisir automatiquement l’algorithme conseillĂ©. Bien que cette constante continuera d’appliquer 
PASSWORD_BCRYPT, depuis PHP 7.2, vous pouvez opter pour
PASSWORD_ARGON2I qui se veut ĂȘtre le prochain standard Ă  venir.

En PHP 7.3, l’algorithme Argon2 introduit une nouvelle variante qui est recommandĂ©e car un mix entre Argon2i et Argon2d, le Argon2id via la nouvelle constante PASSWORD_ARGON2ID.

A noter que vous pouvez migrer de Bcrypt Ă  Argon2 sans problĂšme. En effet, la valeur que vous avez stockĂ© en base de donnĂ©es contient une empreinte du mot de passe, mais Ă©galement l’algorithme utilisĂ©. La fonction
password_verify() fera automatiquement la différence entre des mots de passe utilisant Bcrypt et des mots de passe utilisant Argon2.

Ressources récentes