Accueil Technologies Les nouveautés de la version PHP 7.2
Elephant PHP

Les nouveautés de la version PHP 7.2

par Jérémy PASTOURET

La semaine fut longue ! Je reviens du Forum PHP avec des nouvelles technos et des nouvelles idées plein la tête, et j’ai décidé de vous parler de ce qui m’a le plus intéressé. Je commence par la nouvelle version de PHP 7.2, qui sort le 30 novembre 2017.

Cette liste des nouveautés m’a été présentée par Rémi Collet, Release Manager de PHP 7.2 (responsable de nouvelle version). Il a un site de repository/blog pour la communauté Fedora et permet l’installation en parallèle de PHP, si vous souhaitez en savoir plus c’est par ici.

La roadmap de la version PHP 7.2

Le 7 novembre 2017, une nouvelle branche apparaît sur le projet PHP intitulé 7.2.0.

Le 9 novembre 2017, c’est la dernière Release Candidate numéro 6 avant la sortie de version.

Le 30 novembre, c’est la sortie de la version Generally Admitted et donc finale de PHP 7.2.

Si vous souhaitez en savoir plus, je vous propose de lire cette page.

Les changements importants dans PHP 7.2

La fonction supprimée : Mcrypt

La fonction supprimé : Mcrypt

Cette fonction permet de chiffrer et de déchiffrer des données. Celle-ci a été supprimée de cette version. La raison en est simple : elle n’est plus maintenue depuis 8 ans et comporte de nombreuses failles de sécurité. Et surtout, son chiffrage est facilement cassable en le comparant aux fonctions actuelles. En plu,s cette fonction est signalée comme Deprecated (déconseillée) depuis la version 7.1.0.

Donc si vous l’utilisez encore dans vos projets, migrez vers une autre fonction de cryptage moderne car si vous mettez à jour votre PHP, cela risque de coincer.

Si vous souhaitez voir la page des funérailles de mcrypt, je vous indique le lien.

Les fonctions Deprecated (déconseillées) et supprimées pour PHP 8.0

  • __autoload
  • $php_errormsg
  • create_function()
  • mbstring.func_overload
  • (unset) cast
  • parse_str() sans le second argument
  • gmp_random()
  • each()
  • assert() avec un argument string(texte)
  • $errcontext

Honnêtement, il y a rien d’effrayant. La plupart d’entres elles me sont complètement inconnues. C’est aussi le cas pour vous ? Alors je vous conseille de tester la nouvelle version et d’examiner vos logs d’erreur pour voir les deprecated de votre projet.

Si vous avez besoin de plus d’informations sur celles-ci, suivez le guide.

Vous avez aussi les deux fonctions png2wbmp() et jpeg2wbmp() qui permettent de convertir une image png ou jpeg en format WBMP. Mais la grande question à se poser est : qui utilise encore le format lourd WBMP ?

Qui utilise du BMP

L’assignation de chaîne de caractère sans quote

Ce qui est intéressant en lisant la liste des fonctions déprecated, c’est qu’on apprend des mauvaises pratiques d’autres dévéloppeurs. Par exemple, je ne savais pas qu’en PHP, on peut écrire cela :

var_dump(PHP_VERSOIN);

J’ai fait exprès de faire une erreur sur le VERSOIN au lieu de la constante VERSION pour vous faire comprendre le double problème. Le premier étant qu’on peut confondre une chaîne de caractères avec une constante. Le second, c’est qu’on peut avoir des erreurs sur le rendu de la chaîne.

Le résultat avec un display_error=off dans le php.ini donne ceci :

string(11) "PHP_VERSOIN"

Si vous ne me croyez pas, vous pouvez tenter grâce à cette console PHP online :

Par contre si vous ajoutez le display error = on, vous allez obtenir un warning de ce style :

Warning: Use of undefined constantPHP_VERSOIN - assumed 'PHP_VERSOIN' (this will throw an Error in a future version of PHP) in /in/TnmL1 on line 3 string(11) "PHP_VERSOIN"

Si vous êtes en PHP < 7.2, vous aurez ce résultat :

Notice: Use of undefined constant PHP_VERSOIN - assumed 'PHP_VERSOIN' in /in/TnmL1 on line 3 string(11) "PHP_VERSOIN"

Pour tester le code et la performance sur plusieurs versions de PHP, je vous conseille ce site hyper puissant que j’ai découvert.

Et si vous avez bien lu l’erreur en PHP 7.2, il est mentionné que dans la prochaine version, cela déclenchera une erreur. Donc si vous trouvez ce genre de choses dans votre code, changez-le très rapidement…

Pour plus d’informations sur le sujet : https://wiki.php.net/rfc/deprecate-bareword-strings

Compter uniquement ce qu’on peut compter

Compter uniquement ce qu'on peut compter

Derrière ce titre farfelu se cache une vérité simple que ne possède pas PHP. C’est à dire qu’en PHP, on peut tout compter.

Par exemple, si on crée une classe et qu’on fait un count sur l’instance d’un objet, PHP ne renvoie pas d’erreur : il renvoie le nombre de fonctions contenues dans sa classe. Honnêtement, est-ce que ça sert à quelque chose ? Vous ne me croyez pas, voici un exemple :

class test
{
	public function firstFunction()
	{

	}
}

$test = new test();
echo count($test);

Voici le lien du site de test.

Le résultat en PHP 7.2 :

Warning: count(): Parameter must be an array or an object that implements Countable in /in/7p6ga on line 10 1

Le résultat en PHP < 7.2 :

1

Donc, vous l’avez compris : en PHP 7.2, vous aurez un joli warning. Si vous souhaitez quand même faire un beau count sur votre classe, vous pouvez le faire comme ceci :

class test implements Countable
{
	public function firstFunction(){ }
	public function count()
	{ return 42; }
}

$test = new test(); 
echo count($test);

Si vous souhaitez tester, voici le lien.

Dernière petite info, on ne peut pas compter une valeur null. Par exemple :

var_dump(count(NULL));

Vous obtiendrez un warning :

PHP Warning: count(): Parameter must be an array or an object that implements Countable in Command line code on line 1 int(0)

Pour avoir plus d’informations sur ce qu’on peut vraiment compter en PHP ? Suivez le lien.

Une fatal error sur les Prototypes non compatibles

Maintenant, vous devez avoir des prototypes qui ont les même arguments. Sous peine d’obtenir cette erreur fatale :

PHP Fatal error: Declaration of Zend\Log\Writer\FingersCrossed::setFormatter($formatter) must be compatible with Zend\Log\Writer\AbstractWriter::setFormatter($formatter, ?array $options = NULL)

Un nouveau mot réservé dans PHP

J’ai nommé le type object qui est maintenant réservé, pour plus d’informations : http://php.net/manual/en/reserved.other-reserved-words.php.

Ce qui fait que maintenant, on peut écrire cela :

function foo(object $obj): object {
return $obj;
}

Et les tableaux et les objets se transforment bien

Maintenant, on peut faire un cast d’un object vers un array et vice versa facilement et sans problème.

Exemple pour le cast d’un array vers un objet :

var_dump((object)[0=>1]);

Résultat :

object(stdClass)#1 (1) {
["0"]=>int(1)
}

On peut même faire :

$obj→{'0'} et $obj→{0}

Exemple pour le cast d’un object vers un array :

$obj = new class {
	public function __construct()
	{ $this->{0} = 1; }
};

var_dump((array)$obj);

Résultat :

array(1) {
[0]=> int(1)

On peut même faire :

$arr['0'] et $arr[0]

Grosse mise à jour sympa sur les extensions

Dans PHP >= 7.2, on doit écrire les extensions de cette façon : extension = foo

Contrairement à PHP <= 7.1 :

Linux : extension=foo.so

Windows : extension=php_foo.dll

Nouvelle API de cryptographie avec Sodium

Voici un petit exemple :

$pass = 'secret';
$hash = sodium_crypto_pwhash_str($pass,
SODIUM_CRYPTO_PWHASH_OPSLIMIT_SENSITIVE,
SODIUM_CRYPTO_PWHASH_MEMLIMIT_SENSITIVE);
$test = sodium_crypto_pwhash_str_verify($hash,$pass);

Nouvelle option de hash avec password_hash

Argon2 fait son apparition dans password_hash, voici un exemple :

$options = [
'memory_cost' => PASSWORD_ARGON2_DEFAULT_MEMORY_COST,
'time_cost' => PASSWORD_ARGON2_DEFAULT_TIME_COST,
'threads' => PASSWORD_ARGON2_DEFAULT_THREADS,
];
password_hash('password',
PASSWORD_ARGON2I, $options);

Les performances des dernières versions de PHP

Good

La version 7.1 est plus performante de ~4.5% par rapport à la version 7.0.

Et la version 7.2 est plus performante de ~4.5% par rapport à la version 7.1.

C’est mieux que rien, on prend toujours même si ça peut paraître peu.

En conclusion

Cette version, qui est finalement mineure, est destinée à faire le ménage sur des fonctions qui ne sont plus utilisées – voire dangereuses car elles ne sont plus maintenues.

Et vous avez de la chance, je vous ai retrouvé le PowerPoint du Forum PHP. C’est mon cadeau de Noël avant l’heure. Par contre, âmes sensibles s’abstenir : le contenu est en anglais.

Edit du 02/12/2019 : la communauté PHP vient de publier la version 7.4. Pour le récap des nouveautés, c’est par ici.

Vous pourriez aussi aimer

2 commentaires

Pierre Aribaut 24 mars 2018 - 8 h 27 min

create_function() il me semble l’avoir vu dans certains scripts, j’ai vu que le passage à php 7.2 pour PunBB provoque pas mal d’erreurs, pas mal de choses à changer visiblement.
Php 8 est prévu pour bientôt ou on a le temps ? 😉

Répondre
Jérémy PASTOURET 5 avril 2018 - 14 h 23 min

Le changement fait partie des mises à jour. Si on n’en faisait pas, on resterait bloqués pendant un moment à cause de morceaux de code beaucoup trop legacy.

Concernant PHP 8, beaucoup de choses sont à définir ; difficile de donner une date. Pourtant certaines personnes prédisent une sortie en 2021 : (Post Twitter).
Donc à suivre…

Répondre

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.