Vérification de la syntaxe PHP contrôle source

faisant référence à Existe-t-il un analyseur de code statique [comme Lint] pour les fichiers PHP? -- je regarde comment évaluer le contenu des fichiers PHP avant qu'ils ne soient engagés par les développeurs. quelle que soit la solution(s) appropriée (s) sera déclenchée via SVN hooks similaire à la réponse: est-il possible de vérifier la syntaxe du fichier PHP à partir de PHP?

J'ai trouvé cette syntaxe automatique vérification des fichiers PHP lors de la vérification dans SVN qui est l'angle que je vais chercher, cependant ... php -l n'est pas suffisant.

par exemple, étant donné le code:

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

il en résulte:

2012/01/15 02:51:14 [erreur] 694#0: *164 FastCGI envoyé dans stderr: "PHP Notice: Undefined variable: foo

comparé à:

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

une partie de cela se résume à éduquer les codeurs sur les meilleures pratiques. Malheureusement, certains n'apprennent pas aussi rapidement que d'autres, et la seule façon de s'assurer que la conformité aux normes de codage est respectée est de réduire ce qui entre dans SVN qui n'a pas été testé ou qui n'est pas conforme.

du premier lien dans cette question, j'ai essayé:

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

==== /mnt/hgfs/espace de travail/scratch-pad/phpinfo.php:44: Avertissement: la comparaison (inconnu) == (string): ne peut pas vérifier la comparaison entre les types inconnus

Tous sont intéressants à leur façon, mais aucun n'attrape ces problèmes qui ne sont vraiment trouvés qu'à l'exécution.

appréciez les commentaires et les réflexions sur ce sujet.

MODIFIER

il y avait une affiche qui suggérait que PHPLint était la bonne voie à suivre. J'ai pensé, OK! Essayons à nouveau étant donné qu'il y a une nouvelle version: phplint-pure-c-1.1_20120202 :

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

Simple test .................... et, il travaille et rapporte 1 erreur, 1 avertissement. Toutefois, si le texte suivant est ajouté avant , la mention if est ajoutée:

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

il ne fonctionne pas , et les rapports 0 erreurs, 2 avertissements.

34
demandé sur Community 2012-01-15 15:06:47

6 réponses

je pense que c'est un peu difficile pour un analyseur de donner des avertissements. Le code que vous avez donné pourrait fonctionner avec l'aide register_globals, par exemple. En outre, il peut être défini dans un autre fichier qui inclut ce fichier. Pour ces raisons, les fichiers PHP devraient être analysés avec le contexte complet des autres fichiers pour que cela soit vraiment fiable, et la configuration PHP/serveur devrait également être disponible ou définie au mécanisme d'analyse.

cela dit, Êtes-vous sûr que phplint ne fait pas ce que vous voulez?

il y a un validateur en ligne que vous pouvez utiliser pour le tester. Compte tenu de l'entrée:

<?php

echo $foo;

le résultat était:

        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.

alors qu'avec isset() il n'a pas trouvé de problèmes.

EDIT: donc pour cet autre cas de test:

<?php

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

sur Linux Mint 8 la réponse est:

$ 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.

et avec ceci:

<?php

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

c'est:

$ 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.

donc ça ne marche pas comme il faut, et de rapporter le problème correctement?

11
répondu eis 2012-01-15 14:16:35

vous pourriez vouloir combiner phpcs (pour adhérer aux normes de codage) et un nouveau projet de Sebastian Bergmann: https://github.com/sebastianbergmann/hphpa cela utilise le compilateur statique par facebook pour vérifier les erreurs telles que votre recherche... Peut-être trop avant un commit hook, mais un crochet dans votre système de construction peut être suffisant?

8
répondu Gekkie 2012-02-07 09:36:54

tous ces super outils intelligents qui espionnent chaque porte et regardent dans chaque trou de serrure ne seront jamais en mesure de rivaliser avec l'action stupide et émoussée de RUNNING le code.

Quelle est la valeur d'avoir des fichiers php compilables et syntaxiquement valides dans le repo? Vous pouvez faire des zounds de tels dossiers, les engager sur une base régulière au repo et, rassurez-vous, tous contribuent au projet et ajoutent une certaine fonctionnalité fiable, parce que, eh bien, ils ont passé par le crochet de pré-commit pour vérifier leur validité?

il y a un cr@pload de problèmes avec le code écrit par les humains, la syntaxe et les vars manquants n'étant que la pointe de l'iceberg. Les tests unitaires (comme noté par @NikiC) aident beaucoup. Il est de la responsabilité du développeur de faire fiable, code de travail, documenté et test avant de commettre. Les erreurs stupides d'utiliser des var non déclarées est quelque chose que L'IDE peut pointer (Zend Studio, par exemple). Votre objectif est de créer une bonne de travail le logiciel et les tests unitaires sont la clé ici. Ce doit être la principale préoccupation, à mon avis. Les fichiers php valides sont une exigence très lâche...

5
répondu Grigorash Vasilij 2012-03-10 22:54:42

pourriez-vous utiliser un compilateur tiers qui a plus d'options de temps de compilation, comme phc ( http://www.phpcompiler.org/doc/latest/runningphc.html#compiling-web-applications )? (ou, éventuellement, de hip-hop?)

alors j'ai pensé: vous avez besoin de Perl:: critique pour php.

critiquant PHP-code / PerlCritic pour PHP?

(aussi sur google : perl critique pour php )

je souhaite que je pourrait être plus concrètement utile, mais parfois c'est juste une idée qui vous mène à la solution. C'est ce que j'ai à offrir :)

David

2
répondu David Thornton 2017-05-23 09:59:15

oh ouais, ce qu'il te faut C'est PHPUnderControl! Il vérifiera votre syntaxe, suivra automatiquement vos tests unitaires, fera un index C. R. A. P., et plus de bonnes choses. En gros, c'est de la bombe!

Check it out, voici l'URL: http://phpundercontrol.org/

1
répondu Steven McConnon 2012-04-25 01:49:39

bien qu'il ne s'agisse pas d'un vérificateur en ligne de commande, PHPStorm doit être l'un des meilleurs IDE disponibles.

il a diverses inspections qui peuvent détecter le genre de problèmes que vous avez mentionnés. En outre, il exécute automatiquement ces inspections sur les fichiers que vous engagez dans le contrôle de version, en vérifiant les variables non définies, le code de mauvaise qualité et "todos".

cependant le problème avec ces inspections est qu'ils ne peuvent pas comme ils savent tout, ils se trompent parfois en étant des "suggestions" ou des "avertissements" plutôt que des erreurs.

cependant, il est tout à fait bon à ce qu'il fait, et il peut ce genre de problèmes pendant que vous éditez et, Habituellement, il résulte en corrigeant les erreurs bien avant toute action de propagation de toute façon.

0
répondu nathan-m 2012-04-25 12:51:56