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.
- Télécharger PHP 7.3 : https://windows.php.net/download#php-7.3-nts-VC15-x64
- Télécharger PHP 7.2 : https://windows.php.net/download#php-7.2-nts-VC15-x64
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