Configurer PHPStan pour WordPress et WooCommerce
Avec Syntastic ou simplement en ligne de commande, j'utilise PHPStan qui vient de passer en version 1.0, signe de maturité. Quand il analyse du code écrit pour fonctionner avec WordPress et éventuellement WooCommerce, PHPStan va hurler des choses comme "Function wp_mail not found" ou "Instantiated class WC_Order not found". Sans aller jusqu'à lui faire analyser WP ou WC, ce qui serait long et inutile, il faut lui faire découvrir les symboles de WP et WC comme ceci :
-
Dans le projet, que ce soit un plugin ou un thème WordPress, installer d'abord PHPStan :
composer require --dev phpstan/phpstan
-
Ajouter les stubs (le squelette) des fonctions de WordPress fournis par Viktor Szépe :
-
composer require --dev szepeviktor/phpstan-wordpress
-
puis créer le fichier
phpstan.neon
parameters: level: max bootstrapFiles: - %rootDir%/../../php-stubs/wordpress-stubs/wordpress-stubs.php
ou exécutercomposer require --dev phpstan/extension-installer
-
-
Si c'est du code qui interagit avec WooCommerce
-
ajouter aussi les stubs de WooCommerce :
composer require --dev php-stubs/woocommerce-stubs
-
et ajouter dans le fichier phpstan.neon :
parameters: bootstrapFiles: - %rootDir%/../../php-stubs/woocommerce-stubs/woocommerce-stubs.php
-
ajouter aussi les stubs de WooCommerce :
-
Note :
bootstrapFiles
n'est pas la même chose quescanFiles
ouscanDirectories
. Comme indiqué dans la doc, PHPStan exécute les fichiers de stubs qu'on lui indique parbootstrapFiles
, alors qu'il va juste lire les fichiers indiqués parscanFiles
ouscanDirectories
.scanFiles
etscanDirectories
servent dans le cas où on a du logiciel tiers (inclus parinclude
ourequire
etc, mais pas dans les dépendances de Composer) et on ne veut pas que PHPStan hurle qu'il ne connaît pas les classes, variables ou fonctions qui sont définies dans ce logiciel tiers. -
Pour utiliser PHPStan en ligne de commande, pas besoin d'en faire plus :
./vendor/bin/phpstan analyse functions.php
-
Pour l'utiliser via Syntastic, c'est plus compliqué.
Je veux pouvoir utiliser PHPStan aussi bien par la copie installée par Composer dans un projet,
que par la copie installée dans /usr/local/bin/ donc j'ai créé ce script intermédiaire pour Vim :
#!/bin/bash ARGS="$@" if [ -r phpstan.neon ]; then # note : on a le niveau 5 par défaut dans ~/.vim/bundle/syntastic/syntax_checkers/php/phpstan.vim # mais je veux pouvoir régler projet par projet avec le fichier phpstan.neon ARGS=$( echo $@ | sed -E 's/--level=\S+//' ) fi PHPSTAN_PREFERE="./vendor/phpstan/phpstan/phpstan.phar" if [ -x "$PHPSTAN_PREFERE" ]; then "$PHPSTAN_PREFERE" $ARGS else phpstan $ARGS fi
et j'ai mis dans mon ~/.vimrc
let g:syntastic_php_phpstan_exec = '/home/herve/scripts/phpstan-composer-prioritaire.sh'