PHPStan est sorti en version 1.0

Posté par  . Édité par Benoît Sibaud, claudex, Ysabeau 🧶 🧦, palm123, bobble bubble et tisaac. Modéré par Benoît Sibaud. Licence CC By‑SA.
Étiquettes :
24
7
nov.
2021
PHP

PHPStan, un outil d’analyse statique de code PHP, vient de sortir en version 1.0. Pour l’occasion, un nouveau niveau de criticité a été créé.

PHPStan est une bibliothèque en PHP permettant de faire de l’analyse statique de code PHP. Elle permet de détecter des erreurs dans du code, sans avoir besoin de l’exécuter (à la différence des outils de débogage ou de profiling, qui se basent sur une vraie exécution du code). Créé il y a 6 ans, PHPStan est devenu depuis un outil de référence pour ceux qui souhaitent surveiller la qualité de leur code.

Pour rappel, les niveaux de criticité couvrent les cas suivants (tirés de la documentation officielle) :

  • 0 : vérifications basiques, classes ou fonctions inconnues, méthodes inconnues appelées par $this, nombre d’arguments passés pour ces méthodes ou fonctions incorrect, variables jamais définies
  • 1 : variables potentiellement non définies, méthodes magiques et propriétés sur des classes avec __call et __get
  • 2 : méthodes inconnues vérifiées sur toutes les expressions (pas seulement sur $this), validation de PHPDocs
  • 3 : types de retour, types assignés à des propriétés
  • 4 : vérification basique de code inutilisé - instanceof toujours à « false » et autres vérifications de type, branches else inutilisées, code injoignable après un return;, etc.
  • 5 : vérification du type des arguments passés aux méthodes et aux fonctions
  • 6 : reporter les indices de type
  • 7 : reporter les types d’union en partie erronées - Si vous appelez une méthode qui existe seulement pour certains types dans un type d’union le niveau 7 commence à vous en informer; autres situations potentiellement incorrectes
  • 8 : reporter les méthodes d’appel et les propriétés d’accès sur des types nullable
  • 9 : être strict sur le type mixed - la seule opération que vous pouvez faire ce type est de le passer vers un autre type mixed

C’est ce niveau 9 qui a donc été ajouté, avec la version 1.0 : il permet de limiter l’usage du type mixed (un type indiquant que le retour d’une fonction peut être de différents types).

Goodies from Bleeding Edge

Pour fêter la sortie de cette première version stable, l’équipe propose quelques produits dérivés (t-shirts et badges).

Larastan aussi est en version 1.0

Larastan, un wrapper autour de PHPStan spécifiquement développé pour le framework Laravel passe lui aussi en version 1.0.

Et vous, vous en êtes à quel niveau ?

Aller plus loin

  • # Ils sont partout

    Posté par  (site web personnel) . Évalué à 3. Dernière modification le 08 novembre 2021 à 14:46.

    Quel langage dynamique n'a pas son vérificateur de type statique maintenant ? Ils sont partout ces vérificateurs. Et c'est une bonne chose pour notre industrie, on va enfin pouvoir se hisser au niveau de fiabilité du C++. Arf !!

    • [^] # Re: Ils sont partout

      Posté par  . Évalué à 4.

      Et pendant ce temps là, Rust pousse le bouchon encore plus loin. :)

      • [^] # Re: Ils sont partout

        Posté par  . Évalué à 4.

        Moi qui n'ai jamais codé en Rust, j'aimerais bien que tu nous en dises plus.

        • [^] # Re: Ils sont partout

          Posté par  . Évalué à 4.

          Un article comme celui là est un bon aperçu sans doute : https://polyfloyd.net/post/how-rust-helps-you-prevent-bugs/

          Rust permet par conception de quasiment éliminer certaines classes de bug de langages comme C/C++ , en plus de toutes les erreurs qui sont impossibles à faire dans un langage à typage statique.

          Par exemple le langage est conçu de manière à ce que les utilisations de pointeurs après avoir détruit sur l’objet sur lequel ils pointent est impossible. Le compilateur est capable de détecter une telle erreur du programmeur, le programme est incorrect et ne compilera pas.

        • [^] # Re: Ils sont partout

          Posté par  . Évalué à 2. Dernière modification le 11 novembre 2021 à 13:27.

          Je n'ai pas encore assez pratiqué et pas assez réfléchi à la question pour pouvoir bien l'expliquer. Mais je vais tenter une formulation (partielle) :

          Pour quelqu'un qui vient du C/C++, c'est un peu comme si tu avais le compilateur avec le niveau max de warning + un analyseur statique d'activer à la compilation.
          Genre c'est pas un plus, c'est obligatoire de corrigé les erreurs remontées.

          Mais j'ai dit un peu, car en fait le langage est beaucoup moins permissif notamment niveau gestion mémoire (ex: il impose le paradigme RAII), mais du coup le compilateur est aussi capable de mieux analyser/suivre le code qui est écrit, et donc détecter s'il y a des erreurs.
          Bien sur il ne va pas dire si l’algorithme ne fait pas ce que le nom de la fonction dit. Mais par contre il est capable de dire si le programmeur essaie d'utiliser une variable avant qu'elle soit initialisée, après quel soit détruite, mais aussi si deux bouts de code essaient de modifier la même variable indépendamment.
          Bien sur pour du code synchrone il y a des outils pour permettre la synchro et le partage de variable/donnée. Mais il faut utiliser des types spécifiques et qui du coup explicite l'intention.

          J'aime aussi la séparation Safe/Non-safe qui permet d'expliciter et d'encadrer les parties ou la gestion mémoire est faite de façon moins stricte (nécessaire pour certain conteneurs/types de base).

          Et ce n'est que quelques exemples non exhaustifs.

          L'avant-propos et l'introduction de la doc officielle peut apporter d'autres éléments également :
          En anglais : https://doc.rust-lang.org/book/foreword.html
          Ou en Français : https://jimskapt.github.io/rust-book-fr/foreword.html

          • [^] # Re: Ils sont partout

            Posté par  . Évalué à 3.

            Merci à Thomas Douillard et toi pour ces explications.

            Juste une petite remarque/question : je suppose que tu voulais dire "Bien sur pour du code asynchrone" ?

  • # Coquilles

    Posté par  . Évalué à 2.

    C'est bien évidemment une fois publiée que je découvre que j'ai laissé passer des coquilles…

    Quelqu'un peut corriger, svp ?
    * à la différence des outils de débogage ou de profiling, qui se basent sur une vraie exécution du code
    * Créé il y a 6 ans, PHPStan est devenu
    * être strict sur le type mixed type

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.