Obsolète dans PHP 8.1 null
作為參數(shù)傳遞給許多核心函數(shù)。我的主要問題是 htmlspecialchars(php)
和 trim(php)
等函數(shù),其中 null
ne se convertit plus silencieusement en cha?ne vide.
Pour résoudre ce problème sans utiliser beaucoup de code, j'ai essayé de renommer les fonctions intégrées d'origine et de les remplacer par des wrappers qui convertissent l'entrée de null
en une cha?ne (vide).
Le principal problème de cette approche est que la fonction rename_function(PECL apd)
ne fonctionne plus, elle a été mise à jour pour la dernière fois en 2004 1.
J'ai besoin d'une sorte de réécriture des fonctions intégrées pour éviter d'écrire une vérification nulle à chaque fois que la fonction est appelée, ce qui rendrait tout mon code deux fois plus gros.
La seule autre solution à laquelle je peux penser est d'utiliser simplement ma fonction personnalisée, mais cela nécessite toujours de parcourir tout le code et les bibliothèques tierces dont je dispose.
Dans PHP 8.1, null n'est plus converti silencieusement en cha?ne vide lorsqu'il est transmis à une fonction intégrée.
Je pense (et en passant, les réponses existantes ont mon soutien) brossent un tableau différent de la fa?on dont de tels ??problèmes?? sont per?us et résolus. Cela ne diminue en rien le bien ou le mal de l’approche décrite, mais constitue simplement une perspective supplémentaire qui, espérons-le, sera mutuellement bénéfique. Chaque projet est différent.
Principe donné?:
Eh bien, cela me semble (au début) être un problème de rapport. En ne signalant pas E_DEPRECATED
.
L'avantage de ceci est que (pas seulement votre code) sait désormais que votre code est accompagné d'un avis de dépréciation. Le rapport fonctionne vraiment .
En revanche, la suppression des notifications de dépréciation peut les faire dispara?tre. Si vous perdez une base de code avec un avis de dépréciation, techniquement, il peut toujours être facile de récupérer de la perte (encore une fois, signalez l'avis de dépréciation), mais si la modification est étendue, cela peut maintenant être un bruit écrasant (E_TOO_MUCH_NOISE).
Alors, le code qui n'est pas silencieux est-il réellement une mauvaise chose?? Ou peut-il être transformé en avantages ? Je préfère choisir ce dernier. Quoi qu’il en soit, nous traitons déjà ces informations.
Donc, dans ce cas, mon idée est généralement de ne pas supprimer les notifications de dépréciation, mais plut?t de "faire taire" les appels de fonction. C'est facile, mais stupide dans le bon comme dans le mauvais sens :
trim($mixed); #1 -> @trim($mixed); #2
Il s'agit bien entendu d'une opération qui peut être appliquée à une base de code à l'aide d'outils texte standards. Il vous montre également où l'opérateur de suppression @
a été utilisé dans le passé?:
@trim($mixed); #3 -> @@trim($mixed); #4
Si vous étiez un développeur PHP et regardiez un code comme celui-ci (pour les cas n°2 à n°4) dans un éditeur, ils vous crieraient immédiatement , et pour les quatre cas, attireraient au moins votre attention ($mixed
).
Merci de ne pas rester silencieux, nous laissons ces endroits crier, mais pas au moment de l'exécution 1.
Contrairement à la première méthode consistant à garder le silence en ne signalant pas E_DEPRECATED
來保持沉默的方法不同,這種方法很容易丟失信息,而信息是通過使用所有 @
, où les informations peuvent facilement être perdues, les informations sont enregistrées en utilisant tous les symboles
@
Est-ce que cela aidera à résoudre le problème du bruit ? Si nous arrêtons de travailler ici, cela ne fonctionnera absolument pas. Nous allons maintenant peindre le code avec un signe p>- et décider de ne prendre aucune autre mesure, afin de pouvoir utiliser la première solution (ne pas signaler de message de dépréciation) pour le compléter sans toucher au code.
Alors quels sont ses bienfaits ? Eh bien, même si le code s'exécute désormais silencieusement
, PHP fournit toujours des messages de diagnostic. Autrement dit, il est désormais possible d'enregistrer les gestionnaires d'erreurs PHP en tant qu'écouteurs (lors de l'exécution du code).
@
Seulement au niveau du code, il est facile de vérifier ces emplacements car le symbole
La deuxième partie est importante car même si plusieurs endroits peuvent être affectés par la dépréciation, il ne doit pas y avoir une solution unique qui les résoudra tous (je préfère rester à l'écart des ??solutions?? ??à taille unique?? si possible), mais surtout dans le contexte de la question PHP 8.1 a changé et j'imagine qu'il y aura des besoins différents selon l'endroit où il est utilisé
Par exemple, dans le code du modèle (sortie), les types concrets ne posent pas de problème, donc la conversion en cha?ne est probablement la solution préférée?:
@trim($mixed); -> trim((string)$mixed) @@trim($mixed); -> @trim((string)$mixed)
Le modèle (sortie) reste stable.
Mais pour la gestion réelle des entrées, un avis de dépréciation peut révéler des défauts potentiels réels qui méritent d'être corrigés, tels que des valeurs par défaut manquantes (ce qui rend les choses trop compliquées), une gestion peu claire des valeurs (null contre null, cha?nes, booléens contre nombres). ) ) est confondu avec les tableaux et les objets en PHP) ou simplement $mixed
en général.
Cette trim($mixed)
est peut-être une protection de sécurité qui a été oubliée pendant de nombreuses années et qui n'a jamais été mise à niveau (de meilleures protections de sécurité sont disponibles). Pour un code comme celui-ci, je suis presque s?r de vouloir et d'exiger déjà trim($mixed)
可能是一個被遺忘多年的安全防護,從未進行過升級(有更好的安全防護可用)。對于這樣的代碼,我很確定我已經想要并要求 $mixed
實際上是 $string
before 我使用 trim ()
en fait $string
trim ()
. La raison est très simple, au moins deux choses me viennent immédiatement à l'esprit : trim()
a) n'est plus nécessaire - il peut être supprimé (un de mes 李>correctifs
$mixed 進行修補是完全有效的? ''
如果原始使用是字符串或null
L'application de correctifs utilisant $mixed est-elle entièrement valide?? ''
Si l'utilisation originale est une cha?ne ou null
. TypeError
@trim($mixed); -> trim($mixed ?? '') @@trim($mixed); -> @trim($mixed ?? '')Mais à part ?a, un nombre comme 42, par exemple, lancera
au lieu d'un message de dépréciation. Cela fait la différence entre le code en cours d'exécution et le code qui ne l'est pas.
Il y a donc plus à maintenir ici, comme la vérification des emplacements, un regroupement supplémentaire si possible, puis l'application de correctifs plus spécialisés. Cela peut révéler des tests ou des assertions manquants, prendre un certain temps pour stabiliser l'ensemble du flux d'application, etc. @
, vous risquez de perdre ces informations si le plan de correctif ne les capture pas.
Je ne suis pas surpris de me gratter la tête ou de me frotter les yeux alors que j'ai l'air plus instruit dans ces régions. Ensuite, je me rappelle que ces erreurs ne sont pas causées par la version PHP 8.1, le changement de version ne fait que les faire appara?tre (à nouveau), et parfois j'obtiens même des clusters complets d'erreurs comme capture accessoire en maintenant les versions PHP.
Cheat Sheet????(string)$mixed
- Comportement précédent $mixed ?? ''
- 僅在 null
上抑制 TypeError
Erreur@
- Suppression complète des erreurs. Vous devez documenter votre base de code le cas échéant. @@
- Si cela se produit, cela pourrait être un endroit intéressant à étudier. 空($mixed)? '' : xxx($mixed)
- Sortez les poubelles, le désordre typique de la paralysie aérienne/hybride, et recherchez les clusters, l'opportunité de simplifier grandement la base de code. Migrez vers les types scalaires (PHP 7), en introduisant le typage strict de l'intérieur vers l'extérieur, en utilisant le typage PHP "classique" et "strict" le cas échéant. Les assertions PHP 7.0 et les messages de dépréciation de PHP 8.1 le prennent bien en charge. Gestionnaire d'erreurs
Il n'y a rien de magique dans la gestion des erreurs, c'est un standard documenté sur PHP.net (avec Exemple #1), qui agit comme un observateur des événements d'erreur et peut différencier les erreurs supprimées et non supprimées via error_reporting(php)error_reporting(php)
/ error_reporting(php-ini)
至少達到通常需要的級別,如果需要進行區(qū)分(在生產環(huán)境中,E_DEPRECATED
通常不是報告的一部分)。此示例性處理程序會拋出所有報告的錯誤,對于棄用事件以及 E_ALL
也會拋出此類錯誤,因此需要 @
/ error_reporting(php-ini)
ne fait généralement pas partie du rapport). Cet exemple de gestionnaire renvoie toutes les erreurs signalées, ainsi que pour les événements de dépréciation et E_ALL
, donc l'opérateur de suppression
set_error_handler(static function ($type, $message, $file, $line) use (&$deprecations) { if (!(error_reporting() & $type)) { // This error code is not included in error_reporting, so let it fall // through to the standard PHP error handler // capture E_DEPRECATED if ($type === E_DEPRECATED) { $deprecations[] = ['deprecations' => count($deprecations ?: [])] + get_defined_vars(); } return false; } // throwing error handler, stand-in for own error reporter // which may also be `return false;` throw new ErrorException($message, $type, error_reporting(), $file, $line); });Des gestionnaires d'erreurs similaires peuvent être trouvés dans les exemples étendus
E_USER_DEPRECATED
sur 3v4l.org, y compris sur le code obsolète à signaler.
E_USER_DEPRECATED
結合使用,與上面 E_DEPRECATED
Techniquement, l'opérateur de suppression d'erreur peut être utilisé conjointement avec
de la même manière que décrit pour ci-dessus. E_DEPRECATED
@trigger_error('this. a message.', E_USER_DEPRECATED);??Cela fait exactement la même chose?: émettre des événements de dépréciation, mais les exclure des rapports PHP. En vous y abonnant, vous risquez de vous noyer dans le bruit. Avec ?? vous pouvez toujours obtenir du "bon et original" directement depuis PHP. ??
@
錯誤抑制運算符的方法并對其進行評論時,IMSoP 立即舉起紅/黑旗(正確!),很容易將嬰兒與洗澡水一起倒掉@
. Dans ma réponse, son but est simplement de supprimer les notifications de dépréciation mais le résultat de l'utilisation de est qu'il supprime tous les messages de diagnostic et erreurs, même les plus fatals dans certaines versions de PHP, donc PHP se termine avec 255, aucun diagnostic supplémentaire n'est requis - soyez juste prudent et gérez. Cet opérateur est puissant. Suivez son utilisation dans la base de code et vérifiez constamment si elle répond à vos attentes. Pour les situations juridiques, pensez à utiliser un silencieux. Pour le portage/maintenance du code, marquez-le d'abord. Une fois que vous avez terminé de modifier le lot, supprimez-le à nouveau. Tout d'abord, deux choses à retenir?:
htmlspecialchars($something)
可以替換為 htmlspecialchars($something ?? '')
Ensuite, quelques options?:
?? ''
ou corriger une erreur logique, vous ne voulez pas null de toute fa?on. nullable_htmlspecialchars
et recherchez et remplacez directement dans votre code. nullableoverridehtmlspecialchars
;然后在添加 use function nullableoverridehtmlspecialchars;
utilisera cette fonction au lieu de la fonction intégrée. Cependant, cela doit être ajouté à chaque fichier, vous aurez donc peut-être besoin d'un outil pour l'ajouter automatiquement. ?? ''
aux appels de fonction appropriés afin que vous n'ayez pas à les modifier manuellement. Malheureusement, il ne semble pas encore y avoir de règles intégrées pour cela, vous devrez donc apprendre à écrire les v?tres. ?? ''
à des cas simples.