Como Encontrar Funções Não Utilizadas em Seu Projeto PHP

Como desenvolvedor, manter uma base de código limpa e eficiente é crucial para a saúde a longo prazo de qualquer projeto. Um problema comum que pode inchar seu código e contribuir para a dívida técnica é ter funções não utilizadas. Neste post do blog, vamos explorar como você pode identificar efetivamente essas funções não utilizadas em seus projetos PHP, utilizando tanto os recursos integrados do PHP quanto um script personalizado.

A Importância de Identificar Funções Não Utilizadas

Funções não utilizadas podem levar a:

  • Recursos Desperdiçados: Códigos extras ocupam espaço e podem desacelerar sua aplicação.
  • Complexidade: Mais código significa mais complexidade, tornando seu projeto mais difícil de navegar e manter.
  • Riscos de Segurança: Código não utilizado pode inadvertidamente expor vulnerabilidades que ainda não foram descobertas.

Encontrar e remover essas funções é essencial para uma gestão de código ideal.

Usando Recursos do PHP para Localizar Funções Não Utilizadas

O PHP oferece alguns recursos integrados que você pode aproveitar para analisar sua base de código. Dois recursos notáveis incluem:

  • Reflexão: Ele fornece a capacidade de refletir sobre classes, métodos e funções para entender seu uso.
  • Tokenização com token_get_all(): Essa função permite que você analise o código PHP em tokens, facilitando a identificação da estrutura do código.

No entanto, confiar apenas nesses recursos pode não lhe dar uma imagem completa, onde a criação de scripts personalizados pode ajudar.

Uma Solução Rápida e Simples: Script PHP Personalizado

Com base em pesquisas recentes e feedback da comunidade, aqui está um script personalizado para ajudá-lo a encontrar funções não utilizadas em seu projeto PHP. Este script analisa o diretório do seu projeto, identifica definições de funções e suas referências, e apresenta os resultados de forma legível.

Passo 1: Configurando Seu Ambiente

  • Certifique-se de ter um ambiente PHP configurado.
  • Verifique se o caminho do diretório do seu projeto está correto.
  • Copie o seguinte script para um novo arquivo .php.

Passo 2: O Script PHP

<?php
$functions = array();
$path = "/caminho/para/meu/projeto/php"; // Atualize este caminho para o diretório do seu projeto.
define_dir($path, $functions);
reference_dir($path, $functions);
echo "<table>";
echo "<tr><th>Nome</th><th>Definido</th><th>Referenciado</th></tr>";
foreach ($functions as $name => $value) {
    echo "<tr><td>" . htmlentities($name) . "</td>";
    echo "<td>" . (isset($value[0]) ? count($value[0]) : "-") . "</td>";
    echo "<td>" . (isset($value[1]) ? count($value[1]) : "-") . "</td></tr>";
}
echo "</table>";

function define_dir($path, &$functions) {
    if ($dir = opendir($path)) {
        while (($file = readdir($dir)) !== false) {
            if (substr($file, 0, 1) == ".") continue;
            if (is_dir($path . "/" . $file)) {
                define_dir($path . "/" . $file, $functions);
            } else {
                if (substr($file, - 4) != ".php") continue;
                define_file($path . "/" . $file, $functions);
            }
        }
    }       
}

function define_file($path, &$functions) {
    $tokens = token_get_all(file_get_contents($path));
    for ($i = 0; $i < count($tokens); $i++) {
        $token = $tokens[$i];
        if (is_array($token) && $token[0] == T_FUNCTION) {
            $i++;
            $token = $tokens[$i + 1]; // Obtém o nome da função a seguir
            if (is_array($token) && $token[0] == T_STRING) {
                $functions[$token[1]][0][] = array($path, $token[2]); // Armazena a definição da função
            }
        }
    }
}

function reference_dir($path, &$functions) {
    if ($dir = opendir($path)) {
        while (($file = readdir($dir)) !== false) {
            if (substr($file, 0, 1) == ".") continue;
            if (is_dir($path . "/" . $file)) {
                reference_dir($path . "/" . $file, $functions);
            } else {
                if (substr($file, - 4) != ".php") continue;
                reference_file($path . "/" . $file, $functions);
            }
        }
    }       
}

function reference_file($path, &$functions) {
    $tokens = token_get_all(file_get_contents($path));
    for ($i = 0; $i < count($tokens); $i++) {
        $token = $tokens[$i];
        if (is_array($token) && $token[0] == T_STRING) {
            if ($tokens[$i + 1][0] == "(") { // Verifica se é uma chamada de função
                $functions[$token[1]][1][] = array($path, $token[2]); // Armazena a referência da função
            }
        }
    }
}
?>

Passo 3: Executando o Script

  1. Atualize a variável $path no script para apontar para o diretório do seu projeto PHP.
  2. Execute o script através da sua linha de comando ou servidor web.
  3. A saída será uma tabela HTML exibindo todas as funções, quantas vezes são definidas e quantas vezes são referenciadas.

Conclusão

Este script personalizado oferece uma maneira eficiente de rastrear funções não utilizadas em seu projeto PHP. Embora os recursos integrados do PHP, como Reflexão e token_get_all(), sejam poderosos, ter um script sob medida pode agilizar o processo de identificação e gerenciamento de funções não utilizadas. Como uma melhor prática, considere executar este script periodicamente para manter sua base de código limpa e eficiente.

Ao manter seu projeto organizado, você não apenas melhora seu desempenho, mas também facilita a manutenção e colaboração a longo prazo.