Dawid Panfil

Analiza statyczna kodu w PHP – podstawowe narzędzia

Im kod jest większy i więcej osób nad nim pracuje – tym trudniej zapanować nad jego jakością. Na szczęście istnieją narzędzia, które pomagają nam – programistom – zapanować nad chaosem i są one znane pod nazwą analiza statyczna kodu.

Co robi analiza statyczna kodu?

Analiza statyczna polega na weryfikowaniu kodu bez jego uruchamiania – jak to jest w wypadku testów jednostkowych. Narzędzia te sprawdzają kod pod kilkoma względami:

  • składni
  • zachowane PSR
  • wykrycie ewentualnych bugów
  • wykrywanie miejsc kodu, który nigdy się nie uruchomi
  • wskazywanie miejsc do refaktoryzacji
  • wykrywanie miejsc, w którym kod jest zbyt skomplikowany, a zarazem nieczytelny

Wymieniać tak możemy jeszcze długo, chociaż widać że lista już jest wystarczająco duża i interesująca, aby przyjrzeć się z bliska oferowanym narzędziom.

Wybór narzędzi

Ja w swoich projektach wykorzystuje następujące narzędzia:

  • phpcs oraz phpcbf – pierwsze służy do drobnych poprawek w stylu, a drugie testuje kod pod względem PSR.
  • phpcd – dba o DRY. Wskazuje miejsca, gdzie kod jest zduplikowany i można go wydzielić do osobnej funkcji/klasy.
  • phpmd – mess detector – sprawdza bardzo dużo rzeczy m.in: skomplikowanie kodu i jego czytelność, długość klas, problematyczne miejsca w kodzie itp.
  • phpstan – szuka potencjalnych błędów i bugów w kodzie – do tego wymusza, aby kod był komentowany.

Powyższe narzędzia zaprezentuje na frameworku Symfony, ale bez problemu da się je użyć dosłownie wszędzie.

PHPCodeSniffer oraz PHP Code Beautifier and Fixer

Te dwa narzędzie będą omawiał razem, bo jedno z drugim żyć nie może.

Najpierw zainstalujmy oba narzędzia. Do swojego pliku composer.json doklej:

   "memaw/phpcs": "^1.0@dev",
   "squizlabs/php_codesniffer": "^2.7",

I zainstaluj. Uruchom najpierw:

vendor/bin/phpcbf src --standard=PSR2
– automatycznie poprawia drobne błędy wg PSR2 typu ilość spacji, w złym miejscu zamknięcie klamry, brak wolnej linii po końcu klasy.

Następnie uruchom:

vendor/bin/phpcs src --standard=PSR2 --ignore=src/DataFixtures/*,src/Migrations/*
– sprawdza jakość kodu, czy nie potrzeba wykonać poprawek, których nie dał rady poprawić powyższy skrypt (np ilość znaków linii). Tutaj od razu dodałem moją konfigurację dla Symfony. Osobiście fixtur oraz migracji nie sprawdzam, bo tam potrafią być bardzo długie ciągi tekstu (chociażby zapytania sql) lub za długie funkcje – ze względu na uzupełnianie X encji dla testów. Poniżej masz wynik jaki dostaniesz po uruchomieniu tego polecania:

FILE: /var/www/whocalledsymfony/src/Command/CheckerCommand.php
----------------------------------------------------------------------
FOUND 0 ERRORS AND 1 WARNING AFFECTING 1 LINE
----------------------------------------------------------------------
 26 | WARNING | Line exceeds 120 characters; contains 122 characters
----------------------------------------------------------------------


FILE: ...ww/whocalledsymfony/src/Service/Number/AbstractNumberChecker.php
----------------------------------------------------------------------
FOUND 2 ERRORS AFFECTING 1 LINE
----------------------------------------------------------------------
 18 | ERROR | The var keyword must not be used to declare a property
 18 | ERROR | Visibility must be declared on property
    |       | "$multiplierVat"
----------------------------------------------------------------------

PhpMessDetector – złożoność kodu

Sądzę, że nie ma sensu powtarzać zdania – „zapobiega potencjalnym bugom”. Także oprócz tego oblicza złożoność kodu, wyszukuje nieużywanych zmiennych, sprawdza czy obiekty nie są zbyt duże itp itd. Ogólnie dużo sprawdza i nie jest proste, aby w podstawowej konfiguracji wszystkie testy przeszły poprawnie. Dlatego podrzucam Ci mój pliczek konfiguracyjny, który wrzucasz do głównego katalogu.

Instalacja przez composer polega na wpisaniu:

 "phpmd/phpmd": "^2.6",

Uruchomienie na:

  vendor/bin/phpmd src text phpmd.xml  

Natomiat plik phpmd.xml masz tutaj:

To narzędzie jest tak duże, że nie będę teraz więcej o nim pisać. Zrobimy osobny wątek 😉 Dodam jedynie, że można też pobrać to narzędzie jako plik wykonywalny i wskazać go w phpstorm – wtedy będziemy na bieżąco widzieć co mamy do poprawki. Jak zintegrować phpstorm z phpmd także pokażę w innym wpisie.

Phpstan – kolejne narzędzie do statycznej analizy kodu źródłowego

Skrypt ten analizuje kod i wykrywa kolejne bugi np instrukcje warunkowe, które będą zawsze się wykonywać (bądź nigdy). Pomoże to też zmniejszyć złożoność kodu i najważniejsze wyeliminuje ‚dziwne błędy’ gdzie do instrukcji warunkowej dokleja się przykładowo „& 1=1”.

Uruchomienie tego narzędzia jest też bardzo proste. Wskazujesz folder do analizy oraz level. Level jest od 0 do 4 i jeśli dopiero zaczynasz w jakimiś dużym projekcie z analizą statyczną kodu – zacznij od zera, bo program wyłapie bardzo dużo błędów – nawet takie, że masz źle opisaną zmienną.

Tak jak w wypadku phpmd – tutaj też jest kilka rzeczy, które można skonfigurować. Ja korzystam z levelu oraz z wykluczonych plików, gdzie znowu mam testy i migracje wrzucone.

Instalacja przez composer polega na wpisaniu:

"phpstan/phpstan": "^0.11.7"

Uruchomienie na:

 vendor/bin/phpstan analyse src -c phpstan.neon 

Natomiat plik phpstan.neon masz tutaj:

Podsumowanie – analiza statyczna kodu

Przedstawiłem Ci kilka narzędzi z których jak korzystam codziennie w pracy. Jednakże jest ich o wiele więcej i można znaleźć chociażby takie ciekawe programy jak

  • chrun – który sprawdza, który kod jest „zastały” i warto mu się przyjrzeć
  • phpcpd – narzędzie, które wyszukuje duplikatów w kodzie. Pomaga pilnować DRY
  • phpmetrics – dużo ciekawych informacji na temat naszego kodu i repozytoriów, z których korzystamy.

Jednak należy zachować umiar, bo co za dużo to jednak nie zdrowo i więcej czasu zajmie nam czekanie, aż wszystkie narzędzia się wykonają niż piszemy faktycznie kodu 😉

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *