2012-01-15 10 views
34

Refiriéndose a Is there a static code analyzer [like Lint] for PHP files? - Estoy buscando cómo evaluar el contenido de los archivos PHP antes de que sean comprometidos por los desarrolladores. Cualquiera que sea la (s) son apropiadas se activará a través de SVN ganchos similar a la respuesta: Is it possible to check PHP file syntax from PHP?Comprobación de la sintaxis PHP pre-source control

me encontré con este Automatic Syntax checking of PHP files when checking into SVN que es el ángulo que voy a, sin embargo ... php -l no es más que suficiente.

Por ejemplo, teniendo en cuenta el código:

if ($foo == 'bar') { 
    echo $foo; 
} 

Esto se traduce en:

2012/01/15 02:51:14 [error] 694#0: *164 FastCGI sent in stderr: "PHP Notice: Undefined variable: foo

En comparación con:

if (isset($foo)) { echo $foo; } 

Algo de esto se reduce a la educación de los codificadores en las mejores prácticas . Desafortunadamente, algunos no aprenden tan rápido como otros, y la única manera de garantizar el cumplimiento de los estándares de codificación es reducir lo que entra en SVN que no se ha probado o no es compatible.

Desde el primer eslabón de esta pregunta, me han tratado:

if ($foo == 'bar') { 
        \_ HERE 

==== /mnt/hgfs/workspace/scratch-pad/phpinfo.php:44: Warning: comparing (unknown) == (string): cannot check the comparison between unknown types

  • phpcs - PHP Code Sniffer
    • no notifica sobre el problema con $foo pesar PHP Sanity Check indicando que era la respuesta correcta
  • SimpleTest
    • es muy agradable, pero requiere que los desarrolladores que escriben el código malo para escribir buenas pruebas unitarias ...

Todos son interesantes en su propio camino, pero ninguno se están poniendo estos problemas que realmente solo se encuentran en tiempo de ejecución.

Apreciar las opiniones/pensamientos sobre este tema.

EDITAR

Había un cartel que sugirió que PHPLint era el camino correcto a seguir.Pensé, OK! Vamos a intentarlo de nuevo teniendo en cuenta que hay una versión nueva: phplint-pure-c-1.1_20120202:

<?php 
if ($foo == 'bar') { 
    echo $foo; 
} 
?> 

Prueba simple y ...................., funciona y informa 1 error, 1 advertencia. Sin embargo, si se añade el siguiente ANTES la declaración if:

<?php 
if (isset($foo) && $foo == 'bar') { echo 'man'; } 
if ($foo == 'bar') { 
    echo $foo; 
} 
?> 

no funciona, y los informes de errores, 2 0 advertencias.

+8

Honestamente, permítales escribir pruebas unitarias. La comprobación de sintaxis no encontrará la mayoría de las fallas. La prueba unitaria lo hará. – NikiC

+6

Tenga mucho cuidado al hacer este tipo de cosas en un enlace svn pre-commit. De hecho, diría rotundamente que no lo hagas. No se puede ver el resultado de un enlace de precompilación de svn a menos que se rechace el compromiso; eso puede ser increíblemente perturbador cuando se bloquean las confirmaciones basadas en errores no críticos. Es mejor implementar dichos controles en las máquinas del desarrollador a menos que valore la conformidad por encima de la productividad. Aterrizar en su sistema de compilación sería más apropiado dado que usa svn. – AD7six

+0

siempre habrá algunos casos en los que algo no funciona de la manera que te gustaría. Eso no cambia el hecho de que phplint hizo lo que originalmente le pediste. Eso sí, en realidad no dije que debieras usarlo; solo insinué que encajaba con los requisitos que planteabas. – eis

Respuesta

11

Creo que esto podría ser un poco difícil para un analizador para advertencias. El código que ha dado podría funcionar con la ayuda register_globals, por ejemplo. Además, podría definirse en algún otro archivo que incluya este archivo. Por esas razones, los archivos PHP deben analizarse con el contexto completo de otros archivos para que esto sea realmente confiable, y la configuración de PHP/servidor también debe estar disponible o definida para el mecanismo de análisis.

Dicho esto, ¿estás seguro de que phplint no hace lo que quieres?

Hay un online validator que puede utilizar para probarlo. Teniendo en cuenta la entrada:

<?php 

echo $foo; 

el resultado fue:

 echo $foo; 
        \_ HERE 
==== 3: ERROR: variable `$foo' has not been assigned 
END parsing of test-qBlPWw 
==== ?: notice: unused package `dummy.php' 
==== ?: notice: unused module `standard' 
Overall test results: 1 errors, 0 warnings. 

mientras que con isset() no encontró ningún problema.

EDIT: por lo que para este otro caso de prueba:

<?php 

if ($foo == 'bar') echo $foo; 

En Linux Mint 8 la respuesta es:

$ src/phplint test.php 
/home/vadmin/phplint/phplint-pure-c-1.0_20110223/test.php:3: ERROR: variable `$foo' has not been assigned 
/home/vadmin/phplint/phplint-pure-c-1.0_20110223/test.php:3: Warning: comparing (unknown) == (string): cannot check the comparison between unknown types 
Overall test results: 1 errors, 1 warnings. 

y con esto:

<?php 

$foo = '1'; 
if ($foo == 1) echo $foo; 

es:

$ src/phplint test.php 
/home/vadmin/phplint/phplint-pure-c-1.0_20110223/test.php:6: ERROR: comparing (string) == (int) 
Overall test results: 1 errors, 0 warnings. 

por lo que no está funcionando como debería, e informar el problema correctamente?

+0

hola, no usé el validador en línea ya que no enviaremos nuestro código a través del cable fuera de la organización ... descargué y compilé el código de PHPLint y ejecuté localmente lo que no devolvió lo que ha mostrado – sdolgy

+0

Sí , No quise decir que debería usar el validador en línea para su aplicación ... Quise decir que el validador en línea debería ser el mismo que el local. En phplint-windows-1.020110223 instalado localmente, el resultado es el mismo: BEGIN análisis de example.php 1: \t eis

+0

agradable. compilado phplint-pure-c-1.0_20110223 en Linux da diferentes resultados. increíble. – sdolgy

2

¿Podría utilizar un compilador de terceros que tenga más opciones de tiempo de compilación, como phc (http://www.phpcompiler.org/doc/latest/runningphc.html#compiling-web-applications)? (¿o posiblemente hiphop?)

Entonces pensé: necesitas Perl :: Critic para php.

Critiquing PHP-code/PerlCritic for PHP?

(también Google: crítico de Perl para php)

me gustaría poder ser más concretamente útil, pero a veces es simplemente una idea que se llega a la solución.Eso es lo que tengo que ofrecer :)

David

8

Es posible que desee combinar phpcs (a adherirse a los estándares de codificación) y un nuevo proyecto de Sebastian Bergmann: https://github.com/sebastianbergmann/hphpa Este utiliza el compilador estática por facebook para comprobar si hay errores como su búsqueda ... ¿Podría ser demasiado como un enlace precompromiso, pero un gancho en su sistema de compilación podría ser suficiente?

5

Todas estas herramientas superpotentes inteligentes que escuchan a hurtadillas cada puerta y miran en cada ojo de la cerradura nunca podrán competir con la acción estúpida y contundente del código RUNNING.

¿Cuál es el valor de tener archivos php sintácticamente válidos compilables en el repositorio? Puedes hacer zounds de dichos archivos, comprometerlos regularmente con el repositorio y, estar seguro, todos ellos contribuyen al proyecto y agregar una cierta característica confiable, porque, bueno, pasaron por el enlace precompromiso para verificar su validez?

Existe un cr @ pload de problemas con el código escrito por humanos, la sintaxis y los vars faltantes son solo la punta del iceberg. Las pruebas unitarias (según lo observado por @NikiC) ayudan bastante. Es responsabilidad del desarrollador realizar un código confiable, de trabajo y documentado y la prueba antes de comprometerse. Los errores tontos de usar vars no declarados es algo que el IDE puede señalar (por ejemplo, Zend Studio lo hace). Su objetivo es crear un buen software trabajando y las pruebas unitarias son la clave aquí. Esta debería ser la principal preocupación en mi opinión. Los archivos php válidos son un requisito muy flexible ...

1

¡Ah sí, lo que necesitas es PHPUnderControl! Verificará su sintaxis, chackará automáticamente sus pruebas unitarias, realizará un C.R.A.P. índice, y más cosas buenas. Básicamente es la bomba!

comprobar que funciona, aquí está la URL: http://phpundercontrol.org/

0

aunque no es un comprobador de línea de comandos, PHPStorm tiene que ser uno de lo mejor de IDE allí.

Tiene varias inspecciones que pueden detectar el tipo de problemas que ha mencionado. Además, vuelve a ejecutar automáticamente estas inspecciones en los archivos que está comprometiendo con el control de versiones, verificando variables indefinidas, código de mala calidad y "todos".

Sin embargo, el problema con estas inspecciones es que no pueden saber todo, por lo que a veces se equivocan al ser 'sugerencias' o 'advertencias' en lugar de error.

Sin embargo, es bastante bueno en lo que hace, y puede tener este tipo de problemas durante la edición y, por lo general, da como resultado corregir los errores mucho antes de cualquier acción de compromiso.

Cuestiones relacionadas