O que há de novo no PHPStan 1.0?


0

Logotipo da PHPStan

O PHPStan ganhou um lançamento importante no início de novembro de 2021 com novos recursos, regras extras e muitas otimizações de desempenho. Isso significa que o principal analisador estático do PHP agora é considerado estável e vem com uma promessa de compatibilidade com versões anteriores para atualizações futuras.

Como é um grande obstáculo, o PHPStan 1.0 também traz algumas mudanças importantes que podem afetar suas varreduras existentes. Isso inclui regras extras e alguns parâmetros de configuração substituídos ou removidos.

O Novo Nível 9

PHPStan varre sua fonte PHP para encontrar problemas potenciais sem realmente executar o código. Juntamente com os testes de unidade e de ponta a ponta, isso dá visibilidade da qualidade do seu código, identificando problemas antes que os usuários os encontrem.

Os níveis de PHPStan são usados ​​para configurar a rigidez do analisador. A série de lançamento v0.x oferecia oito níveis, com 0 o mais relaxado e 8 o mais rígido. Embora seja preferível usar o nível mais estrito possível para a melhor cobertura, níveis menos rigorosos podem ajudá-lo a apresentar o PHPStan a uma base de código imperfeita.

PHPStan 1.0 adiciona o nível 9 como uma nova opção. Inclui todas as regras do nível 8 e inferior, bem como uma verificação extra: estrito mixed comparações de tipo.

Propaganda

o mixed type chegou ao PHP 8.0 como uma forma de digitar explicitamente “qualquer” valor. Como mixed é essencialmente equivalente a um valor não digitado, não é seguro fazer suposições sobre o que mixedvalor -type parece.

O nono nível do PHPStan irá aplicar isso estritamente, relatando um erro se você tentar usar ativamente um mixed valor em seu código. Acessar uma propriedade ou chamar um método não é permitido, pois você não pode saber se eles existirão. Você só pode passar valores por meio de outros mixed-type type indica quando esta regra está ativa.

Para aceitar o novo comportamento, você precisará alterar level: 8 para level: 9 na tua phpstan.neon arquivo de configuração. PHPStan também suporta level: max como um apelido para o nível mais alto. Se você já está usando max, você obterá automaticamente o nível 9 ao atualizar para o PHPStan 1.0.

Melhor Conscientização Em Blocos Try-Catch-Finalmente

O PHPStan agora tem melhor inferência de tipo e percepção variável para blocos tente-pegar-finalmente. Vai usar o @throws tag docblock para verificar os tipos de exceção lançados por cada função em sua base de código. Esse entendimento é usado para informar as verificações de disponibilidade de variáveis ​​nos blocos try-catch.

Aqui está um exemplo que demonstra por que isso é importante:

/**
 * @throws DemoException
 */
function first() {
    throw DemoException();
}
 
/**
 * @throws OtherException
 */
function second() {
    throw OtherException();
}
 
try {
    $first = first();
    $second = second();
}
catch (DemoException $ex) {
    error_log($second);
}
catch (Exception $ex) {
    error_log("General exception");
}

O primeiro catch acessos de blog $second mas isso não existirá quando DemoException está capturado. PHPStan v1.0 usa o @throws declaração para perceber isso para que você seja informado quando seu catch os blocos fazem referência a variáveis ​​possivelmente indefinidas. Funções sem @throws as anotações geralmente se comportam da mesma maneira que antes.

Como resultado dessa mudança, o opcional polluteCatchScopeWithTryAssignments parâmetro foi removido. Isso costumava permitir que você acesse as variáveis ​​definidas em um try bloquear dentro do seguinte catch; não é mais necessário, pois o PHPStan agora pode determinar quais variáveis ​​estão disponíveis.

Detecção de código não utilizado

O PHPStan ficou melhor em encontrar e relatar algumas formas de código não utilizado em seu projeto. Ele irá destacar as propriedades, métodos e constantes da classe privada que nunca são chamados ou acessados.

Propaganda

Sua presença quase sempre não é intencional. Se você quiser manter o código morto por mais tempo, pode tentar comentá-lo ou adicionar o @phpstan-ignore-next-line comentário para ignorar a verificação.

Melhorias nos valores lembrados

v1.0 melhora a consistência da memória do PHPStan para valores de retorno de função. É mais adequado para entender quando uma função é chamada uma segunda vez, oferecendo uma melhor antecipação de valores de retorno idênticos.

Isso leva a uma detecção aprimorada de código morto quando uma condição é repetida várias vezes. O PHPStan avisará quando um bloco se tornar redundante porque a execução foi encerrada por um branch anterior com a mesma condição:

if ($demo -> isActive()) {
    return;
}
 
if ($demo -> isActive()) {
    recordDemoActivity();
}

O segundo bloco nunca será executado, pois o primeiro sempre termina. No entanto, existe uma suposição em jogo: isActive() deve sempre devolver o mesmo valor ao longo da vida de $demo. Em termos mais concretos, isActive() precisa ser uma função pura em que entradas repetidas sempre produzem saída idêntica.

O PHPStan assume que as funções são puras por padrão. Nos casos em que não estão, você pode adicionar o @phpstan-impure anotação em um docblock acima da definição da função. Isso desativará a memória do valor de retorno para essa função. Você precisaria usar isso no exemplo acima se isActive() poderia retornar um valor diferente para cada chamada, o que significa que a primeira verificação poderia ser igual a false e permitir que o segundo ramo seja executado.

/** @phpstan-impure */
public function isActive() : bool {
    return (date("Y") === "2021");
}

Outras melhorias de regra

Várias novas regras foram adicionadas aos níveis existentes de 1 a 6. Estas incluem verificações para substituir constantes e propriedades, tentando estender um final classe e detecção de sempre verdadeiro e sempre falso while condições do loop.

Propaganda

Tipos agora são verificados para dicas de tipo ausentes recursivamente. Isso significa que as definições PHPDoc como array<array> não serão aceitos porque carecem de uma definição de tipo interna. Você precisará digitar a dica dos valores esperados dos elementos da matriz de segundo nível também, como array<array<string>>.

Além de verificar o conteúdo da fonte, o PHPStan 1.0 analisa a validade geral do .php arquivos também. O nível 0 ganha uma verificação de espaço em branco de arquivo à esquerda e à direita e BOM, como caracteres perdidos antes ou depois do <?php ... ?> O par de tags pode causar saída inesperada em tempo de execução.

Desempenho e estabilidade

O desempenho foi aprimorado em várias áreas, otimizando operações específicas e resolvendo alguns vazamentos de memória. Isso deve contribuir para varreduras mais rápidas e confiáveis ​​de bases de código maiores.

Como a v1.0 é considerada uma versão estável formal, ela vem com a garantia de que as versões secundárias futuras (1.1, 1.2, 1.3, etc.) serão compatíveis com versões anteriores. Embora ir de v0.x para v1.0 possa exigir alguns ajustes de configuração, você terá um caminho de migração mais fácil no futuro.

Os desenvolvedores de extensões e conjuntos de regras personalizados do PHPStan também se beneficiam de uma base de código mais estável que é menos provável de ser alterada. A documentação do desenvolvedor também foi expandida, incluindo uma cobertura mais acessível da criação de regras personalizadas. Deve ser mais fácil começar ao implementar as próprias regras de sua equipe em sua análise PHPStan.

Propaganda

Embora isso seja um bom augúrio para suporte futuro, tanto os usuários quanto os desenvolvedores de extensões enfrentam grandes mudanças na mudança para a v1.0. Vários parâmetros de configuração de varredura foram renomeados ou alterados, com bootstrap tornando-se bootstrapFiles e excludes_analyse substituído por excludePaths.

Internamente, a API de extensões foi amplamente revisada, de modo que muitas classes e métodos foram alterados ou removidos. A lista completa de alterações incompatíveis com versões anteriores está disponível no changelog v1.0.

Resumo

O PHPStan v1.0 amadurece o projeto otimizando o desempenho, adicionando novas regras e abordando algumas irregularidades de detecção. A evolução do PHPStan nos últimos anos contribuiu para a mudança mais ampla da comunidade PHP para abraçar os conceitos de linguagem digitada. A adição de recursos como propriedades digitadas e tipos de união produziu uma linguagem que é capaz de suportar a inspeção externa avançada, bem como a introspecção interna detalhada por meio de reflexão.

A promoção para uma versão estável semver deve ajudar a encorajar a adoção do PHPStan em toda a comunidade. Migrar para a nova versão deve ser bastante fácil para projetos modernos que já estão usando um nível de regra estrito de PHPStan.

Você pode atualizar para PHPStan v1.0 hoje executando composer require phpstan/phpstan em seus projetos. É aconselhável ler primeiro as notas de versão para identificar as alterações importantes que você precisa resolver. A presença de regras extras em cada nível existente pode fazer com que sua base de código comece a falhar nos testes, mesmo que seja aprovada com PHPStan v0.x. Você pode desativar as novas regras temporariamente adicionando-as à sua linha de base para que sejam excluídas dos resultados da verificação.


Like it? Share with your friends!

0

0 Comments

Your email address will not be published. Required fields are marked *