Analisadores estáticos de códigos PHP

Introdução

Sabemos da importância e esforços necessários para manter uma boa qualidade de código. É bem provável que cada desenvolvedor siga algum tipo de padrão de código. Porém é importante que exista um alinhamento desses padrões para evitar códigos mal escritos, diferentes formas de resolver problemas, prejudicando de forma geral a qualidade do código e tornando difícil a manutenção e a implementação de novas funções.

Para nossa sorte, programadores PHP, temos disponível várias ferramentas chamadas Static Analysis Tools (ou Analisadores estáticos de códigos) que ajudam a avaliar padrões e qualidade de código.

  1. PHP Code Sniffer
  2. Code Sniffer é o analisador de estilo de padrões de código PHP mais simples e fácil de usar. Possui analisador para os padrões de códigos mais conhecidos, como PSR-1, PSR-2, Zend, Pear, entre outros. Caso queria entender mais sobre os padrões da PSR, acesse meu outro artigo.

    Instalando:

    curl -OL https://squizlabs.github.io/PHP_CodeSniffer/phpcs.phar

    Segue abaixo um exemplo de saída do Code Sniffer em um simples arquivo PHP criado intencionalmente fora dos padrões PSR.

    php phpcs.phar --standard=PSR1,PSR2 meuprojeto/
    FILE: ...e/douglas.pasqua/tests/static_analyse_tools/meuprojeto/Hello.php
    ----------------------------------------------------------------------
    FOUND 8 ERRORS AFFECTING 5 LINES
    ----------------------------------------------------------------------
     3 | ERROR | [ ] Each class must be in a namespace of at least one level (a top-level vendor name)
     3 | ERROR | [ ] Class name "Pasqua_Hello" is not in camel caps format
     5 | ERROR | [x] Spaces must be used to indent lines; tabs are not allowed
     5 | ERROR | [ ] Method name "Pasqua_Hello::hello_teste" is not in camel caps format
     5 | ERROR | [x] Opening brace should be on a new line
     6 | ERROR | [x] Spaces must be used to indent lines; tabs are not allowed
     7 | ERROR | [x] Spaces must be used to indent lines; tabs are not allowed
     9 | ERROR | [x] A closing tag is not permitted at the end of a PHP file
    ----------------------------------------------------------------------
    PHPCBF CAN FIX THE 5 MARKED SNIFF VIOLATIONS AUTOMATICALLY
    ----------------------------------------------------------------------
    Time: 29ms; Memory: 4Mb

  3. PHP Code Beautifier and Fixer
  4. PHPCBF é um script disponibilizado junto com o projeto do phpcs e pode ser usado para corrigir automaticamente erros de padrões no seu código. A maioria dos parâmetros usados no phpcs podem ser também usados no phpcbf.

    Instalando:

    curl -OL https://squizlabs.github.io/PHP_CodeSniffer/phpcbf.phar

    Exemplo de uso:

    php phpcbf.phar --standard=PSR1,PSR2 meuprojeto/

    Caso não queira que os arquivos sejam sobrescritos automaticamente, você pode especificar o parâmetro –sufix indicando que a correção será gerada em um arquivo alternativo. Ex:

    php phpcbf.phar --suffix=.corrigido --standard=PSR1,PSR2 meuprojeto/

    Exemplo de saída do comando ao corrigir erros de padrão em um arquivo PHP:

    Processing Hello.php [PHP => 78 tokens in 16 lines]... DONE in 5ms (3 fixable violations)
            => Fixing file: 0/3 violations remaining [made 3 passes]... DONE in 15ms
            => Fixed file written to Hello.php.corrigido
    Fixed 1 files
    Time: 46ms; Memory: 4.25Mb
    

  5. PHP Copy/Paste Detector
  6. PHPCPD é uma ferramenta bem simples usada para detectar códigos repetidos em seu projeto. Ideal para apontar locais onde haja necessidade de refatoração de código. O autor da ferramenta é o Sebastian Bergmann, mesmo criador do phpunit.

    Instalando:

    wget https://phar.phpunit.de/phpcpd.phar

    Na ferramenta é possível controlar a quantidade de linhas repetidas que deve ser considerado um código duplicado além de outras opções.

    php phpcpd.phar meuprojeto/
    phpcpd 2.0.1 by Sebastian Bergmann.
    
    Found 3 exact clones with 34 duplicated lines in 3 files:
    
      -     /meuprojeto/Fornecedor.php:436-445
            /meuprojeto/Catalogo.php:487-496
    
      -     /meuprojeto/CargaFornecedor.php:564-582
            /meuprojeto/CargaEmpresa.php:675-693
    
      -     /meuprojeto/Mensagens.php:438-445
            /meuprojeto/Empresa.php:813-820
    
    0.17% duplicated lines out of 20589 total lines of code.
    
    Time: 393 ms, Memory: 17.75Mb
    

  7. PHPMD – PHP Mess Detector
  8. PHP Mess Detector ou PHPMD é uma ferramenta de análise estática baseada no PHP Depend.
    Ele analisa códigos fontes PHP em busca de diversos tipos de problemas. Podendo identificar por exemplo:

    • Possíveis bugs.
    • Código de baixa qualidade.
    • Código com alta complexidade e difícil legibilidade.
    • Parâmetros, métodos, propriedades não utilizadas.

    Instalando:

    Para instalar o PHPMD, sugiro seguir as instruções descritas no link oficial:
    http://phpmd.org/download/index.html

    Exemplo de uso: (verificando por parâmetros, métodos, etc. não utilizados)

    php vendor/bin/phpmd meuprojeto/ text unusedcode
    meuprojeto/Hello.php:5  Avoid unused private fields such as '$meuvar'.
    meuprojeto/Hello.php:6  Avoid unused private fields such as '$qualquer'.
    

    Formatos de saída permitidos: xml, text, html.
    Regras de análise permitidas: cleancode, codesize, controversial, design, naming, unusedcode.

Integrando com outras Ferramentas

Em alguns casos integrar os scripts de análise de códigos em outras ferramentas podem nos ajudar, de forma mais automatizada, a manter o código de acordo com os padrões e com mais qualidade. Exemplo:

  • Pre-commit hook:
  • É possível escrever um pre-commit hook no git que verifica por padrões de código durante o commit, abortando o mesmo em caso não estiver com os padrões especificados. É comum utilizar o PHP Code Sniffer. Um bom exemplo dessa configuração pode ser obtida em https://github.com/s0enke/git-hooks/tree/master/phpcs-pre-commit.

  • IDEs/Editors:
  • Alguns editores/IDEs permitem configurar o PHP Code Sniffer, Mess Detector, entre outros. Dessa forma gerando warnings durante o processo de desenvolvimento do código, forçando a manter a qualidade do código desde do início. Existem plugins de integração para os Editores mais utilizados, como Eclipse PDT, PhpStorm, SublimeText e até mesmo o vim.

Outros

Além dessas ferramentas explicadas neste artigo, existem outros analisadores estáticos de códigos interessantes a serem levados em consideração para o mundo PHP. Exemplo:

  • Security Advisory Checker:
  • Verifica por problemas de segurança em dependências de pacotes do composer.

  • pfff:
  • pfff é uma coleção de ferramentas de análise de código escrito pelo Facebook.

  • RIPS:
  • Analisador estático de código que busca identificar uma série de vulnerabilidades de segurança em códigos PHP.

  • PHP Analyser:
  • Realiza uma série de análises em códigos PHP.

  • phploc:
  • Mensura rapidamente o tamanho e a estrutura de um projeto PHP.

Please follow and like us:

Follow

Get every new post on this blog delivered to your Inbox.

Join other followers: