34 votes

Syntaxe PHP de vérification pré-contrôle de la source

Se référant à Est-il un analyseur de code statique [comme de la Charpie] pour les fichiers PHP? -- Je suis à la recherche à la façon d'évaluer le contenu des fichiers PHP avant qu'elles soient validées par les développeurs. Quelle solution(s) sont appropriés seront déclenchées via SVN crochets similaire à la réponse: Est-il possible de vérifier le fichier PHP syntaxe de PHP?

Je suis tombé sur cette vérification Automatique de la Syntaxe de PHP les fichiers lors de la vérification dans le SVN qui est l'angle que je vais faire, mais ... php -l n'est pas tout à fait suffisant.

Par exemple, pour 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

Par rapport à:

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

Certains de ce qui revient à l'éducation des codeurs sur les meilleures pratiques. Malheureusement, certains n'apprennent pas aussi rapidement que les autres, et la seule façon de s'assurer que la conformité à des normes de codage est rencontré, c'est de réduire ce qui se passe dans le SVN a été non testés ou n'est pas conforme.

Depuis le premier maillon de 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 manière, mais aucun n'est à la capture de ces problèmes qui sont vraiment seulement être trouvé lors de l'exécution.

Apprécier entrée / réflexions sur ce thème.

MODIFIER

Il y avait une affiche qui a suggéré que les PHPLint était la bonne façon de faire. J'ai pensé, OK! Nous allons essayer à nouveau, étant donné qu'il y a une nouvelle version: phplint-pure-c-1.1_20120202:

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

Test Simple .................... et, il fonctionne et rapports 1 erreur, 1 avertissement. Toutefois, si le suivant est ajouté AVANT l' if déclaration:

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

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

11voto

eis Points 14687

Je pense que cela pourrait être un peu dur pour un analyseur de donner des avertissements au sujet de. Le code que vous avez donné peut travailler avec l'aide register_globals, par exemple. Il peut aussi être définie dans un autre fichier qui est notamment ce fichier. Pour ces raisons, les fichiers PHP doivent être analysés avec plein contexte d'autres fichiers pour que cela soit vraiment fiable, et le PHP/configuration du serveur devrait également être disponible ou définis à l'analyse du mécanisme.

Cela dit, êtes-vous sûr phplint ne pas faire ce que vous voulez?

Il est en ligne validateur que vous pouvez utiliser pour tester. Compte tenu de l'entrée:

<?php

echo $foo;

le résultat a été:

        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 la fonction isset() ça n'a pas de problème.

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.

ainsi n'est-il pas comme il devrait, et de signaler le problème correctement?

8voto

Gekkie Points 588

Vous pourriez combiner phpcs (pour respecter les normes de codage) et un nouveau projet par Sebastian Bergmann: https://github.com/sebastianbergmann/hphpa Ceci utilise la statique compilateur 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?

5voto

Grigorash Vasilij Points 468

L'ensemble de ces intelligente de la super puissance des outils qui suivent chaque porte et de regarder dans chaque trou de la serrure ne sera jamais en mesure de rivaliser avec les stupides et les feuilles d'action de l'EXÉCUTION du code.

Quelle est la valeur d'avoir compilable, syntaxiquement valide les fichiers php dans le repo? Vous pouvez faire zounds de ces fichiers, les engager sur une base régulière pour les pensions de titres et, rassurez-vous, tous de contribuer au projet et ajouter une fonctionnalité fiable, parce que, eh bien, ils sont allés à travers le pre-commit hook pour vérifier leur validité?

Il y a un cr@pload de problèmes avec le code écrit par l'homme, la syntaxe et le manque de vars n'étant que la partie émergée de l'iceberg. Les tests unitaires (comme indiqué par @NikiC) aide un peu. Il est de la responsabilité du développeur de les rendre fiables, de travail, documenté code et le tester avant de s'engager. Des erreurs stupides de l'aide non déclarées vars est quelque chose que l'IDE peut remarquer (Zend Studio, par exemple). Votre but est de créer des bons de travail, des logiciels et des tests unitaires sont la clé ici. Ce doit être la principale préoccupation, à mon avis. Valide les fichiers php est un très lâche exigence...

2voto

David Thornton Points 21

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

Puis j'ai pensé: vous avez besoin de Perl::Critic pour php.

Critique de code PHP / PerlCritic pour PHP?

(aussi sur google : perl critique pour php )

Je souhaite que je pourrais ê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

1voto

Steven McConnon Points 345

Oh ouais, ce que vous avez besoin est PHPUnderControl! Il vérifiera votre syntaxe, automatiquement vérifier vos tests unitaires, faire un C. R. A. P. d'index, et plus de bonnes choses. En gros, c'est de la bombe!

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X