NouveautĂ©s de PHP 7.3 🐘

La nouvelle version de PHP est sortie le 06 décembre 2018, découvrons ensemble les nouveautés de PHP 7.3.

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/ et y placer le contenu de l’archive PHP 7.2
  • CrĂ©er un dossier /PHP7.3/ et y placer le contenu de l’archive PHP 7.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.

Pour aller plus loin

PHP 7.3 intĂšgre de nombreux autres changements. Si le sujet vous intĂ©resse, n’hĂ©sitez pas Ă  vous rĂ©fĂ©rer au guide de migration PHP 7.2 vers PHP 7.3 : http://php.net/manual/en/migration73.php

Ressources récentes