Je viens de commencer à mettre à jour mon code pour qu'il soit compatible avec php 8.1. J'ai beaucoup d'extraits de code dans lesquels je transmets des valeurs nulles potentielles aux fonctions internes.
if (strlen($row) > 0) { ... }
où $row provient d'une source (telle qu'une requête) qui peut avoir des valeurs nulles. Cela peut générer un avertissement de dépréciation ; dans ce cas :
DEPRECATED : strlen() : passer null au paramètre n°1 de type chaîne est obsolète ($string)
Je recherche le moyen le plus simple et le plus rapide de gérer la mise à niveau de ce code, par exemple en fixant l'endroit où la recherche et le remplacement globaux peuvent être effectués. Il semble transtyper la variable que je passe à la fonction interne sans modifier la fonctionnalité.
error_reporting(E_ALL); $row = null; if (strlen((string) $row) > 0) { ... }
Y a-t-il des problèmes avec cette approche de fonctionnalité interne, mis à part les aspects moraux de son codage de cette façon ? Existe-t-il un meilleur moyen (autre que de réécrire complètement le code et de gérer différemment les valeurs nulles) ? Je préfère que cette solution soit rétrocompatible avec la v7.4, même si je serai probablement compatible avec la 8.0.
Je sais qu'il existe d'autres options pour ma fonction définie par l'utilisateur.
Répondez à votre question sur « Le moyen le plus simple et le plus rapide de gérer la mise à niveau de ce code ».
En bref, vous ne pouvez pas.
Tout d'abord, un peu de contexte...
Environ 15 % des développeurs utilisent
strict_types=1
, vous faites donc partie de la majorité qui ne l'utilise pas.Vous pouvez ignorer ce problème maintenant (obsolète), mais PHP 9.0 causera beaucoup de problèmes en en faisant une erreur de type fatale.
Cela dit, vous pouvez toujours utiliser des chaînes de connexion NULL :
Vous pouvez toujours comparer NULL à la chaîne vide :
Et vous pouvez toujours utiliser NULL pour les calculs (il est toujours traité comme 0) :
Vous pouvez toujours imprimer/écho NULL :
Vous pouvez toujours passer NULL à
sprintf()
中,并使用%s
pour le forcer à une chaîne vide, commeVous pouvez toujours forcer d'autres valeurs (en suivant des règles) comme
La coercition NULL fonctionne de cette façon depuis, je suppose depuis le début, et c'est également documenté :
Quoi qu'il en soit, pour corriger...
La première partie, il essaiera de trouver le code que vous devez mettre à jour.
Cela se produit chaque fois que NULLpeut être transmis à l'un de ces arguments de fonction.
Il y a au moins335 paramètres concernés par cela.
Il y a un supplément104, ils sont un peu louches et 558 où NULL a des problèmes , où vous devriez résoudre ces problèmes, par exemple .
define(NULL, '值')
Psaume est le seul outil que je puisse trouver qui aide à cela.
Les Psaumes doivent être à un niveau d’inspection très élevé (1, 2 ou 3).Si vous n'avez jamais utilisé d'outil d'analyse statique auparavant (ne vous inquiétez pas, c'est seulement recommandé 33% des développeurs le font alors attendez-vous à passer beaucoup de temps à modifier votre code (commencez au niveau 8, le plus lâche) ; , et progressez ).
Je ne trouve pas ces problèmes en utilisant PHPStan, Rector, PHP CodeSniffer, PHP CS Fixer ou PHPCompatibility (Source).
Après avoir trouvé chaque question, La deuxième partie est l'édition.
L'endroit le moins susceptible de causer des problèmes est de remplacer l'évier, comme
Vous pouvez également essayer de remonter à la source de la variable et essayer d'empêcher qu'elle soit définie sur NULL en premier lieu.
Voici quelques sources très courantes de NULL :
Certaines de ces fonctions nécessitent un deuxième argument pour spécifier une valeur par défaut, ou vous pouvez utiliser
strval()
...但要小心,您的代码可能会通过 ($a === NULL) à l'avance et vous ne voulez pas le casser.De nombreux développeurs ne réalisent pas que certaines de leurs variables peuvent contenir NULL - par exemple, ils s'attendent à ce que
tous les champs de saisie (qu'ils créent) soient toujours soumis en raison de problèmes de réseau, d'extensions de navigateur, d'utilisateurs modifiant le DOM/URL dans le navigateur, etc. . Cela pourrait ne pas arriver.
Je travaille sur ce problème depuis la majeure partie de l'année.
J'ai commencé à écrire deux RFC pour essayer de résoudre ce problème. La première consiste à mettre à jour certaines fonctions pour accepter NULL (ce qui n'est pas idéal car cela dérange les développeurs qui utilisent strict_types) ; La deuxième RFC est de permettre à NULL de continuer à être appliqué dans ce cas..... .mais je l'ai fait. Je ne le soumets pas au vote car je viens de recevoir une tonne de commentaires négatifs et je ne veux pas que ce rejet cité à l'avenir explique pourquoi ce problème ne peut pas être résolu (alors que les changements originaux ont à peine été discutés, celui-ci) .
Il semble que NULL soit géré différemment car il n'est jamais traité comme une "valeur scalaire" - je ne pense pas que beaucoup de développeurs se soucient de cette distinction, mais cela revient de temps en temps.
La plupart des développeurs avec lesquels j'ai travaillé ignorent ce problème (en espérant le résoudre plus tard, ce qui n'est probablement pas la meilleure idée) ;
Il y a une équipe qui essaie de. Mais plus d'un an plus tard, ils constatent toujours des problèmes (ils ont déclaré qu'ils testaient avec 8.1 alpha 1).
Une autre option que j'envisage est de créer une bibliothèque qui redéfinit toutes ces ~335 fonctions comme nullables sous un espace de noms, par exemplestrval()
应用于所有事情,例如修剪(strval($search))
;
Le développeur inclura ensuite la bibliothèque et utilisera lui-même l'espace de noms :
Si vous essayez explicitement de gérer
null
的情况,那么稍微干净一点的修复方法是strlen($row ?? '')
, utilisez "l'opérateur de coalescence nul".Dans la plupart des cas, les deux sont probablement équivalents, mais avec
strict_types=1
en effet, ils se comportent différemment si la valeur est d'un type différent qui peut être converti en chaîne :Par contre, notez que les variables
??
运算符基于isset
,而不是=== null
et donc non définies se comportent différemment :Si ce cas vous intéresse, l'équivalent le plus direct de l'ancien comportement est encore plus verbeux :