Realizar análisis de código estático en PHP
-
Use el modo
lint
para realizar análisis de código estático en PHP -
Use el proyecto
PHPMD
oPHP Depend
para realizar análisis de código estático en PHP -
Use la herramienta
pfff
para realizar análisis de código estático en PHP -
Use
HHVM
para realizar análisis de código estático en PHP
La parte vital del desarrollo es identificar errores y eliminarlos rápidamente de su base de código, y puede codificar o realizar análisis de código estático para lograr esto en PHP. Este tutorial enseña cómo el modo lint
y algunos otros métodos realizan análisis de código estático en PHP.
El análisis de código estático es una forma increíble de detectar errores, aumentar la productividad general del desarrollador, la finalización automática y refactorizar su código utilizando muchas funciones relacionadas con el tipo para su código PHP fuertemente tipado. Antes de la ejecución o compilación, puede verificar su código fuente para eliminar errores de sintaxis y hacer cumplir los estándares y estilos de codificación de PHP para detectar vulnerabilidades de seguridad en su código.
El modo lint
es una de las mejores formas de realizar análisis de código estático en PHP, y aprenderá más sobre php lint
, PHPMD
, pfff
y HHVM
para adoptar el enfoque que se adapte a sus necesidades. necesita mejor. Se apoya en gran medida en el sistema de tipos de PHP, y cuanta más información proporcione para el análisis estático, mejores resultados obtendrá, y declarar tipos en su código es una forma de agregar más información.
Una función function exp_funct ($args) {}
que obtiene una lista de publicaciones destacadas se puede declarar como function exp_funct (array $args) : array {}
para proporcionar más información para el análisis de código estático. Alternativamente, puede agregar un comentario PHPDoc
para declarar o inicializar los tipos de entrada y salida de la función con algo como // @return array<exp_var>
antes de declarar una función.
Use el modo lint
para realizar análisis de código estático en PHP
El modo Lint PHP
es una de las mejores formas de realizar análisis de código estático para verificar errores de sintaxis e identificar asignaciones de variables no utilizadas, matrices asignadas sin ninguna inicialización, posiblemente advertencias de estilo de código y mucho más. Puede usar php -l NOMBRE DE ARCHIVO
ejecutando PHP y validar la sintaxis sin una ejecución en el modo lint
desde el shell o cualquier otra línea de comando.
Hay muchos analizadores estáticos de alto y bajo nivel en Internet basados en PHP Lint
. Por ejemplo, php-sat
, PHPStan
, PHP-CS-Fixer
y phan
son algunos de los analizadores estáticos de más alto nivel; por otro lado, PHP Parser
y token get all
(función primitiva) son algunos de los analizadores de nivel inferior basados en PHP Lint
.
Puede dividir la fuente dada en tokens de PHP como token_get_all(string $code, int $flags = 0): array
, y token_get_all
lo ayudará a analizar la cadena de código dada en los tokens de lenguaje PHP usando el Zend
escáner léxico
del motor. El indicador del parámetro TOKEN_PARSE
reconoce la capacidad de usar palabras reservadas en un contexto específico y ayuda a devolver una matriz de identificadores de token.
Cada identificador de token devuelto por este método es un solo carácter o una matriz de tres elementos que contiene el índice del token, el contenido de la cadena del token original y el número de línea en los elementos 0, 1 y 2, respectivamente. Encontrará dos ejemplos de token_get_all()
; uno es de uso general y el otro lo realiza en una clase usando una palabra reservada.
<?php
$userQuota_getToken = token_get_all('<?php echo; ?>');
foreach ($userQuota_getToken as $get_tokenQ) {
if (is_array($get_tokenQ)) {
echo "Line {$get_tokenQ[2]}: ", token_name($get_tokenQ[0]), " ('{$get_tokenQ[1]}')", PHP_EOL;
}
}
?>
// 2nd example on class
/*
$token_quota_source = <<<'code'
class A
{
const PUBLIC = 1;
}
code;
$userQuota_getToken = token_get_all($token_quota_source, TOKEN_PARSE);
foreach ($userQuota_getToken as $get_tokenQ) {
if (is_array($get_tokenQ)) {
echo token_name($get_tokenQ[0]) , PHP_EOL;
}
}
*/
// its output will be something similar
/*
T_OPEN_TAG
T_WHITESPACE
.
.
.
T_CLASS
T_WHITESPACE
T_STRING
.
.
*/
Producción :
Line 1: T_OPEN_TAG ('<?php ')
Line 1: T_ECHO ('echo')
Line 1: T_WHITESPACE (' ')
Line 1: T_CLOSE_TAG ('?>')
Además, los analizadores de tiempo de ejecución funcionan en modo lint
y son más útiles para algunas cosas debido a la naturaleza dinámica de este lenguaje de programación. El Xdebug
es un analizador de tiempo de ejecución con cobertura de código y rastreadores de funciones.
El phpweaver
tiene seguimientos de la función Xdebug
y utiliza un enfoque combinado estático/dinámico para realizar análisis de código. Si estás buscando un analizador de código estático para servidores de producción, xhprof
es el mejor analizador estático en modo lint
, similar a Xdebug
, pero más ligero e incluye una interfaz basada en PHP.
Use el proyecto PHPMD
o PHP Depend
para realizar análisis de código estático en PHP
Son las siglas de PHP Mess Detector y es un proyecto derivado de PHP Depend
que pretende ser el analizador de código estático equivalente a la conocida herramienta PMD
de Java. Puede usar el compositor para instalar PHP_Depend
, curl -s http://getcomposer.org/installer | php
y php composer.phar
requiere pdepend/pdepend:2.12.0
o si tiene algún compositor instalado globalmente.
Por otro lado, PHPMD es preferible a PHP_Depend
ya que es más fácil de usar y tiene un front-end fácil de configurar para métricas sin procesar medidas por PHP_Depend
. Toma una base de código fuente determinada (código PHP) y, dado que tiene un principio de funcionamiento sencillo, busca o intenta encontrar posibles errores o precauciones dentro de esa fuente.
Puede detectar fácilmente errores y errores de sintaxis, expresiones demasiado complicadas, propiedades no utilizadas, métodos, parámetros y código subóptimo. Como un proyecto PHP maduro y un analizador de código estático, PHP Mass Detector ofrece una amplia biblioteca de reglas predefinidas para analizar el código fuente de PHP.
// Type phpmd [filename|directory] [report format] [ruleset file]
hassan@kazmi ~ $ phpmd PHP/Depend/DbusUI/ xml rulesets/codesize.xml
<?xml version="1.0" encoding="UTF-8" ?>
<pmd version="0.0.1" timestamp="2009-12-19T22:17:18+01:00">
<file name="/projects/pdepend/PHP/Depend/DbusUI/PHPMD.php">
<violation beginline="54"
endline="359"
rule="TooManyProperties"
ruleset="Code Size Rules"
package="PHP_Depend\DbusUI"
class="PHP_Depend_DbusUI_ResultPrinter"
priority="1">
This class has too many properties; consider refactoring it.
</violation>
</file>
</pmd>
Producción :
This class has too many properties; consider refactoring it.
El uso de la línea de comandos de PHP Mess Detector se puede activar o usar escribiendo phpmd [nombre de archivo|directorio] [formato de informe] [archivo de conjunto de reglas]
, y es posible pasar un nombre de archivo/directorio a PHPMD
como un contenedor para el código fuente de PHP para analizar. Los parámetros codesize.xml
o rulesets
pueden parecer una referencia del sistema de archivos ya que su distribución Phar
incluye los archivos del conjunto de reglas dentro de su archivo.
Además, permite a los programadores de PHP usar nombres abreviados o referencias para referirse a conjuntos de reglas integrados como phpmd
Depende del tamaño del código XML. La interfaz de línea de comandos de PHPMD también acepta argumentos opcionales como --min-priority
, --report-file
, --suffixes
, --strict
, y muchos más.
Puede aplicar la configuración ~ $ phpmd /path/to/source text codesize
utilizando los múltiples conjuntos de reglas aplicados contra el código fuente bajo la prueba y habilitando una llamada a sus herramientas CLI con un nombre establecido. Además, permite una configuración en profundidad para que los programadores mezclen archivos de conjuntos de reglas personalizados con conjuntos de reglas incorporados, y el comando ~ $ phpmd /ruta/a/código de texto fuente,/mi/rules.xml
es un ejemplo perfecto de él para especificar sus conjuntos de reglas personalizadas para analizar el código fuente.
Use la herramienta pfff
para realizar análisis de código estático en PHP
Como conjunto de API y herramientas, puede realizar análisis de código estático para indexar, buscar, navegar, visualizar, refactorizar el código fuente y transformar el código PHP fuente a fuente preservando el estilo.
Es fácil de compilar e instalar pfff
; sin embargo, produce resultados en un formato complejo como go-automatic.php:14:77: CHECK: Use of undeclared variable $goUrl
o login-now.php:7:4: CHECK: Unused Local variable $title
. Puedes acceder a pfff
en GitHub usando $ ~/sw/pfff/scheck ~/code/github/sc/
.
Además, puede incrustar la biblioteca de análisis en su propia aplicación OCaml
copiando los directorios commons/
y parsing_php/
en el directorio de su proyecto y agregando una marca recursiva; al final, vincule la aplicación con la biblioteca parsing_php/parsing_php.cma
y commons/commons.cma
. Además, observe el pfff/demos/Makefile
para una mejor comprensión, y una vez compilada la fuente, puede probar pfff
con lo siguiente:
$ cd demos/
$ ocamlc -I ../commons/ -I ../parsing_php/ \
../commons/commons.cma ../parsing_php/parsing_php.cma \
show_function_calls1.ml -o show_function_calls
$ ./show_function_calls foo.php
Luego, debe poder ver en stdout
alguna información útil sobre las llamadas de función en foo.php
según el código en show_function_calls1.m1
en el proyecto pfff
en los archivos de Facebook. El analizador pfff
es extraordinariamente productivo y puede probarlo en el sitio web phpbb
.
// source code of pfff command-line
$ cd /tmp
$ wget http://d10xg45o6p6dbl.cloudfront.net/projects/p/phpbb/phpBB-3.0.6.tar.bz2
$ tar xvfj phpBB-3.0.6.tar.bz2
$ cd <pfff_src_directory>
$ ./pfff -parse_php /tmp/phpBB3/
El programa pfff
debe iterar sobre todos los archivos de código fuente (archivos fuente .php
) y ejecutar el analizador en cada archivo fuente y generará algunas estadísticas que muestran, como: NB archivos totales = 265; perfecto = 265; =========> 100%
y nb bueno = 183197, nb malo = 0 =========> 100.000000%
lo que significa que pfff
pudo analizar el 100% de su Código fuente PHP.
Como programa de línea de comandos, presenta diferentes comandos como pfff
para probar los analizadores del lenguaje PHP. Puede usar scheck
para encontrar errores, y funciona como lint
y stag
para el generador de etiquetas de Emacs, que es más preciso que cualquier otro.
El sgrep
es un grep
sintético para facilitar la búsqueda de patrones de código precisos, y spatch
es un parche sintáctico para facilitar la refactorización del código PHP, así como codemap
, pfff_db
, codegraph
, y codequery
, son algunas de las últimas incorporaciones a la herramienta pfff
para realizar un análisis global de un conjunto de archivos fuente o consultar información sobre la estructura de su base de código PHP.
Use HHVM
para realizar análisis de código estático en PHP
Tiene soporte integrado de tipo servidor Proxygen y FastCGI y puede ser uno de los analizadores de código estático perfectos. HHVM es conocido como un servidor web totalmente funcional con Proxygen directamente integrado, y su facilidad de uso y procesamiento de código fuente lo hacen muy recomendable para el análisis de código estático.
Sirve solicitudes web rápidas y proporciona un servidor web de alto rendimiento equivalente a FastCGI
y nginx
combinados. Puede implementar hhvm -m server -p 8080
para usar Proxygen cuando ejecuta HHVM en modo servidor y puede configurar el puerto mediante la configuración de la línea de comandos: hhvm.server.port=7777
, o poner -d hhvm.server.port=7777
en su archivo server.ini
.
Puede usar el comando -d hhvm.server.type=proxygen
para definir el tipo de servidor Proxygen sin especificarlo explícitamente (Proxygen es el predeterminado). Los paquetes HHVM de scripts init
se inician en modo FastCGI
de forma predeterminada y requieren ajustes de configuración antes de iniciarse automáticamente como servidor.
El siguiente es un ejemplo de configuración del paquete HHVM con diferentes opciones personalizables (opciones server.ini
o -d
) en la línea de comandos. Recuerde, algunas de estas opciones de configuración son opcionales ya que son el valor predeterminado, pero pueden ayudar a brindar más información o mostrar ilustraciones al usuario.
// initialize a server port
hhvm.server.port = 60
// the default server type is `proxygen`
hhvm.server.type - proxygen
hhvm.server.default_document = source.php
hhvm.error_document404 = source.php
hhvm.server.source_root = /edit/source/php
El uso de opciones de configuración opcionales es bueno para que la documentación sea explícita, y es muy probable que hhvm.server.source_root
y hhvm.server.port
necesiten valores explícitos. HH Virtual Machine es de código abierto y está escrito en Hack
y utiliza una compilación JIT (justo a tiempo) para lograr un rendimiento superior mientras mantiene una flexibilidad de desarrollo excepcional.
El directorio predeterminado en el que se lanzó el binario HHVM es el documento_predeterminado
que puede cambiar en función de su servidor. Después de instalar HHVM en su sistema operativo en su proyecto PHP, puede usar los comandos sudo update-rc.d hhvm defaults
y sudo service hhvm restart
para configurar HHVM para que se inicie en el arranque como servidor.
Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.
GitHub