Maison  >  Article  >  développement back-end  >  Présentation des nouvelles fonctionnalités de PHP 7.2

Présentation des nouvelles fonctionnalités de PHP 7.2

不言
不言original
2018-05-24 14:47:033275parcourir

Le contenu partagé avec vous dans cet article concerne l'introduction des nouvelles fonctionnalités de PHP 7.2. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer

PHP 7.2 a été officiellement publié en novembre. 30, 2017. . Cette version inclut de nouvelles fonctionnalités, fonctionnalités et optimisations pour nous aider à écrire un meilleur code. Dans cet article, je présenterai certaines des fonctionnalités linguistiques les plus intéressantes de PHP 7.2.

Vous pouvez consulter la liste complète des modifications sur la page Demandes de commentaires.

Améliorations principales

Déclaration du type de paramètre

Depuis PHP5, nous pouvons spécifier le type déclaré attendu des paramètres de fonction. Si le mauvais type d’argument est passé, PHP générera une erreur.

La déclaration de type de paramètre (également appelée indice de type) spécifie les types de paramètres qui doivent être transmis aux fonctions ou aux méthodes de classe.

Voici un exemple :

class MyClass {
    public $var = 'Hello World';
}$myclass = new MyClass;function test(MyClass $myclass){
    return $myclass->var;
}echo test($myclass);

Dans ce code, la fonction de test nécessite une instance MyClass. Des types de données de paramètres incorrects entraînent une erreur fatale.

Fatal error: Uncaught TypeError: Argument 1 passed to test() must be an instance of MyClass, string given, called in /app/index.php on line 12 and defined in /app/index.php:8

Depuis PHP 7.2, les indices de type peuvent être utilisés sur les données d'objets, et cette amélioration permet d'utiliser des types d'objets génériques comme paramètres d'une fonction ou d'une méthode. Voici un exemple :

class MyClass {
    public $var = '';
}class FirstChild extends MyClass {
    public $var = 'My name is Jim';
}class SecondChild extends MyClass {
    public $var = 'My name is John';
}$firstchild = new FirstChild;$secondchild = new SecondChild;function test(object $arg) {
    return $arg->var;
}echo test($firstchild);echo test($secondchild);

Dans l'exemple ci-dessus, nous avons appelé la fonction test deux fois, en passant un objet différent à chaque fois. C'était sans précédent dans les versions précédentes de PHP.

Présentation des nouvelles fonctionnalités de PHP 7.2

Test des conseils de type pour PHP 7.0 et PHP 7.2 dans Docker.

Déclaration du type de retour d'objet

Si le type de variable spécifie le type attendu du paramètre de fonction, le type de valeur de retour peut également spécifier le type attendu.

La déclaration de type de retour spécifie le type attendu qu'une fonction doit renvoyer.

Depuis PHP 7.2, les types de données d'objet peuvent être déclarés à l'aide de types de retour. Voici un exemple :

class MyClass {
    public $var = 'Hello World';
}

$myclass = new MyClass;function test(MyClass $arg) : object {
    return $arg;
}

echo test($myclass)->var;

Les versions PHP précédentes renvoyaient l'erreur fatale suivante :

Fatal error: Uncaught TypeError: Return value of test() must be an instance of object, instance of MyClass returned in /app/index.php:10

Bien sûr, le code PHP 7.2 afficherait « Hello World ».

Généralisation des types de paramètres

PHP n'autorise actuellement aucune différence entre les types de paramètres d'une sous-classe et sa classe ou interface parent. Qu'est-ce que cela signifie?
Référez-vous au code suivant :

<?phpclass MyClass {
    public function myFunction(array $myarray) { /* ... */ }
}class MyChildClass extends MyClass {
    public function myFunction($myarray) { /* ... */ }
}

Ici, nous avons omis le type de paramètre dans la sous-classe. En PHP 7.0, l'avertissement suivant est généré :

Warning: Declaration of MyChildClass::myFunction($myarray) should be compatible with MyClass::myFunction(array $myarray) in %s on line 8

Depuis PHP 7.2, nous pouvons ignorer les types dans les sous-classes sans casser aucun code. Cette solution nous permet de mettre à niveau une classe de la bibliothèque pour utiliser des indices de type sans avoir à mettre à jour toutes ses sous-classes.

Guillemets de fin dans la syntaxe de liste

L'utilisation d'une virgule de fin sur le dernier élément d'un tableau PHP est une syntaxe légale et est parfois encouragée pour éviter facilement d'ajouter de nouveaux éléments. Depuis PHP 7.2, pour regrouper les espaces de noms, nous pouvons utiliser des virgules de fin.

Voir les virgules de fin dans la syntaxe de liste pour avoir une idée de la RFC et quelques exemples de code.

Améliorations de la sécurité

Argon2 dans le hachage de mot de passe

Argon2 est un algorithme de hachage puissant qui a remporté le concours d'algorithmes de hachage de mot de passe 2015, et PHP 7.2 remplacera le Bcrypt sécurisé. algorithme.
La constante PASSWORD_ARGON2I a été introduite dans la nouvelle version de PHP, qui peut désormais être utilisée dans la série de fonctions password_* :

password_hash(&#39;password&#39;, PASSWORD_ARGON2I);

Contrairement à Bcrypt, qui n'utilise qu'un seul facteur de coût, Argon2 en utilise trois facteurs de coût pour les distinguer comme suit :

  • Définit la surcharge de mémoire en montant de KiB qui doit être consommée lors du calcul de hachage (la valeur par défaut est 1

  • Définir le coût en temps du nombre d'itérations de l'algorithme de hachage (la valeur par défaut est 2)

  • Facteur parallèle, utilisé pour définir le nombre de threads parallèles utilisés dans les calculs de hachage (valeur par défaut Définir les facteurs de coût par défaut pour 2)

Les trois nouvelles constantes suivantes sont définies :

  • PASSWORD_ARGON2_DEFAULT_MEMORY_COST

  • PASSWORD_ARGON2_DEFAULT_TIME_COST

  • PASSWORD_ARGON2_DEFAULT_THREADS

Elle e est un exemple :

$options = [&#39;memory_cost&#39; => 1<<11, &#39;time_cost&#39; => 4, &#39;threads&#39; => 2];
password_hash(&#39;password&#39;, PASSWORD_ARGON2I, $options);

Recherchez les hachages de mot de passe Argon2 Plus d'informations.

Libsodium fait partie du noyau PHP

À partir de la version 7.2, PHP inclut la bibliothèque Sodium dans son noyau. Libsodium est une bibliothèque multiplateforme et multilingue pour le chiffrement, le déchiffrement, la signature, le hachage de mots de passe, etc.
Cette bibliothèque était auparavant fournie via PECL.
Pour une liste des fonctions Libsodium, voir Démarrage rapide.
Voir aussi PHP 7.2 : le premier langage de programmation à ajouter la cryptographie moderne à sa bibliothèque standard.

Obsolescence

Voici une liste de fonctions et fonctionnalités obsolètes pour PHP 7.2, qui seront toutes supprimées après PHP 8.0.

La fonction __autoload de PHP 5.1 a été remplacée par spl_autoload_register. Un avis de dépréciation sera désormais signalé lors de la compilation.

Lorsqu'une erreur fatale est générée, $php_errormsg des variables locales sont créées. Dans PHP 7.2, error_get_last et error_clear_last doivent être utilisés à la place.

create_function() Vous pouvez créer une fonction avec un nom de fonction, en transmettant les paramètres de la fonction et le corps de la fonction sous forme de liste de la fonction. En raison de problèmes de sécurité et de performances médiocres, il est marqué comme obsolète et l'encapsulation est plutôt encouragée.

mbstring.func_overload ini défini sur une valeur non nulle a été marqué comme obsolète.

(unset) cast est une expression qui renvoie toujours null et est inutile.

Si le deuxième paramètre est transmis, parse_str() analysera la chaîne de requête dans un tableau, sinon elle analysera dans la table des symboles locale. Pour des raisons de sécurité, il n'est pas recommandé de définir dynamiquement des variables dans la portée de la fonction, et l'utilisation de parse_str() sans deuxième argument générera un avis de dépréciation.

gmp_random() dépend de la plateforme et sera obsolète. Utilisez plutôt gmp_random_bits() et gmp_random_rage().

each() Itérer sur un tableau se comporte un peu comme foreach(), mais foreach() est préférable pour plusieurs raisons, comme par exemple qu'il est 10 fois plus rapide. L’utilisation du premier dans une boucle lancera désormais une invite de dépréciation.

assert() La fonction vérifie l'assertion donnée et effectue le traitement approprié si le résultat est FAUX. assert() avec un argument chaîne est désormais obsolète en raison d'une vulnérabilité RCE. L'option ini de zend.assertion désactive les expressions d'assertion.

$errcontext est un tableau contenant des variables locales lorsqu'une erreur se produit. Il peut être utilisé comme dernier paramètre de la fonction du gestionnaire d'erreurs set_error_handler().

Que signifie PHP 7.2 pour les utilisateurs de WordPress ?

Selon la page de statistiques officielle de WordPress, au moment d'écrire ces lignes, seuls 19,8 % des utilisateurs de WordPress ont mis à niveau vers PHP 7. Seulement 5 % utilisent PHP 7.1. Vous pouvez constater que plus de 40 % des utilisateurs utilisent encore PHP 5.6, et ce qui est encore plus effrayant, c'est que plus de 39 % des utilisateurs utilisent une version de PHP qui n'est plus supportée. Depuis décembre 2016, WordPress.org a modifié la recommandation officielle destinée aux utilisateurs de PHP 5.6 pour recommander l'utilisation de PHP 7 ou supérieur.
WordPress PHP 7.1 stats

Statistiques WordPress PHP 7.1

Les performances des données ci-dessus ne sont pas agréables, car il semble que PHP 7 soit plus rapide. Voici quelques statistiques :

  • Les benchmarks officiels de PHP montrent que PHP 7 permet au système d'effectuer 2 requêtes par seconde, ce qui correspond presque à une latence moyenne par rapport à PHP 5.6.

  • Christian Vigh a également publié une comparaison de tests de performances PHP. Il a constaté que PHP 5.2 est près de 400 % plus lent que PHP 7.

Nous avons effectué des tests de performances PHP 5.6 vs PHP 7 vs HHVM en 2018. Semblable au benchmark ci-dessus, nous avons constaté que PHP 7.2 peut effectuer près de trois fois plus de transactions (requêtes) par seconde que PHP 5.6.

WordPress benchmarks

Benchmark WordPress

  • Résultat du benchmark WordPress 4.9.4 PHP 5.6 : 49,18 req/sec

  • Résultat du benchmark WordPress 4.9.4 PHP 7.0 : 133,55 req/sec

  • Résultat du benchmark WordPress 4.9.4 PHP 7.1 : 134,24 req/sec

  • Résultat du benchmark WordPress 4.9.4 PHP 7.2 : 148,80 req/sec �

  • Résultat du benchmark WordPress 4.9.4 HHVM : 144,76 req/sec

Beaucoup de choses sont plus lentes à mettre à jour en raison du temps nécessaire pour s'impliquer dans le test de tous les nouveaux plugins et thèmes tiers pour s'assurer qu'ils fonctionnent correctement. Bien souvent, c'est lent parce qu'ils n'ont pas encore terminé. Vous ne savez pas quelle version de PHP vous utilisez ? L'un des moyens les plus simples consiste à utiliser l'outil Pingdom ou les outils de développement de Google Chrome. Le premier en-tête de requête HTTP affichera généralement votre version.

Check version of PHP

Vérifiez la version PHP

Cela dépendra du fait que l'hôte ne modifie pas la valeur de l'en-tête X-Powered-By. S'il est modifié, vous ne pourrez peut-être pas voir les informations de version PHP. Dans ce cas, vous devez télécharger le fichier via FTP. Ou vous demandez toujours à l'hôte.

La mise à niveau vers PHP 7.2

PHP 7.2 est encore partiellement inachevée, mais vous pouvez d'abord l'essayer. Vous pouvez tester votre site local WordPress ou vérifier vos scripts dans un environnement de type Docker, et vous pouvez tester et comparer différentes versions de PHP à partir de la ligne de commande.

Conclusion

Prêt à passer à PHP 7.2 ? Mais au moins, j'espère que vous avez d'abord migré vers PHP 7 ou supérieur. Si vous n'êtes pas prêt à le tester maintenant, mettez à niveau vos scripts, révisez votre code et parlez de votre première expérience avec PHP 7.2.

Recommandations associées :

Compilez php7.2 sous Windows et Judy extrêmement étendu

Comment installer php7.2 sur Linux

Méthode d'instance d'installation de PHP7.2 sur CentOS7yum

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn