Führen Sie eine statische Codeanalyse in PHP durch
-
Verwenden Sie den
lint
-Modus, um eine statische Codeanalyse in PHP durchzuführen -
Verwenden Sie das Projekt
PHPMD
oderPHP Depend
, um eine statische Codeanalyse in PHP durchzuführen -
Verwenden Sie das
pfff
-Tool, um eine statische Codeanalyse in PHP durchzuführen -
Verwenden Sie
HHVM
, um eine statische Codeanalyse in PHP durchzuführen
Der entscheidende Teil der Entwicklung besteht darin, Fehler zu identifizieren und sie schnell aus Ihrer Codebasis zu entfernen, und Sie können codieren oder eine statische Codeanalyse durchführen, um dies in PHP zu erreichen. Dieses Tutorial lehrt, wie der lint
-Modus und einige andere Methoden eine statische Codeanalyse in PHP durchführen.
Statische Codeanalyse ist eine unglaubliche Möglichkeit, Fehler zu erkennen, die allgemeine Entwicklerproduktivität zu steigern, die automatische Vervollständigung durchzuführen und Ihren Code mithilfe vieler typbezogener Funktionen für Ihren stark typisierten PHP-Code umzugestalten. Vor der Ausführung oder Kompilierung können Sie Ihren Quellcode überprüfen, um Syntaxfehler zu beseitigen und PHP-Codierungsstandards und -stile durchzusetzen, um Sicherheitslücken in Ihrem Code zu erkennen.
Der lint
-Modus ist eine der besten Möglichkeiten, um eine statische Codeanalyse in PHP durchzuführen, und Sie werden mehr über php lint
, PHPMD
, pfff
und HHVM
erfahren, um den einen Ansatz zu wählen, der zu Ihnen passt braucht besser. Es lehnt sich stark an das Typsystem von PHP an, und je mehr Informationen Sie für die statische Analyse bereitstellen, desto bessere Ergebnisse erhalten Sie, und das Deklarieren von Typen in Ihrem Code ist eine Möglichkeit, weitere Informationen hinzuzufügen.
Eine Funktion function exp_funct ($args) {}
, die eine Liste der vorgestellten Posts erhält, kann als function exp_funct (array $args) : array {}
deklariert werden, um weitere Informationen für die statische Codeanalyse bereitzustellen. Alternativ können Sie einen PHPDoc
-Kommentar hinzufügen, um die Eingabe- und Ausgabetypen der Funktion mit etwas wie // @return array<exp_var>
zu deklarieren oder zu initialisieren, bevor Sie eine Funktion deklarieren.
Verwenden Sie den lint
-Modus, um eine statische Codeanalyse in PHP durchzuführen
Der Lint PHP
-Modus ist eine der besten Möglichkeiten, eine statische Codeanalyse durchzuführen, um Syntaxfehler zu überprüfen und unbenutzte Variablenzuweisungen, zugewiesene Arrays ohne Initialisierung, möglicherweise Codestilwarnungen und vieles mehr zu identifizieren. Sie können php -l FILENAME
verwenden, indem Sie PHP ausführen und die Syntax ohne Ausführung im lint
-Modus von der Shell oder einer anderen Befehlszeile validieren.
Im Internet gibt es viele High-Level- und Low-Level-Static-Analyzer, die auf PHP Lint
basieren. Zum Beispiel sind php-sat
, PHPStan
, PHP-CS-Fixer
und phan
einige der übergeordneten statischen Analysatoren; Andererseits sind PHP Parser
und token get all
(primitive Funktion) einige der untergeordneten Analysatoren, die auf PHP Lint
basieren.
Sie können die angegebene Quelle in PHP-Tokens wie token_get_all(string $code, int $flags = 0): array
aufteilen, und token_get_all
hilft Ihnen, die angegebene Codezeichenfolge mithilfe von Zend
in die PHP-Sprachtoken zu parsen. der lexikalische
Scanner der Engine. Das Parameter-Flag TOKEN_PARSE
erkennt die Möglichkeit, reservierte Wörter in einem bestimmten Kontext zu verwenden, und hilft, ein Array von Token-Identifikatoren zurückzugeben.
Jeder von dieser Methode zurückgegebene Tokenbezeichner ist entweder ein einzelnes Zeichen oder ein Array mit drei Elementen, das den Tokenindex, den Zeichenfolgeninhalt des ursprünglichen Tokens und die Zeilennummer in den Elementen 0, 1 bzw. 2 enthält. Sie finden zwei Beispiele für token_get_all()
; eine ist eine allgemeine Verwendung und die andere führt sie mit einem reservierten Wort in einer Klasse aus.
<?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
.
.
*/
Ausgang:
Line 1: T_OPEN_TAG ('<?php ')
Line 1: T_ECHO ('echo')
Line 1: T_WHITESPACE (' ')
Line 1: T_CLOSE_TAG ('?>')
Außerdem arbeiten Laufzeitanalysatoren im lint
-Modus und sind aufgrund der dynamischen Natur dieser Programmiersprache für einige Dinge nützlicher. Der Xdebug
ist ein Runtime-Analyzer mit Code Coverage und Function Tracern.
Der phpweaver
verfügt über Xdebug
-Funktionsspuren und verwendet einen kombinierten statischen/dynamischen Ansatz zur Durchführung der Codeanalyse. Wenn Sie nach einem statischen Code-Analysator für Produktionsserver suchen, ist xhprof
der beste statische Analysator im lint
-Modus, ähnlich wie Xdebug
, aber leichter und enthält eine PHP-basierte Schnittstelle.
Verwenden Sie das Projekt PHPMD
oder PHP Depend
, um eine statische Codeanalyse in PHP durchzuführen
Es steht für PHP Mess Detector und ist ein Spin-off-Projekt von PHP Depend
, das darauf abzielt, das Äquivalent zum statischen Code-Analysator des bekannten Java-Tools PMD
zu sein. Sie können Composer verwenden, um PHP_Depend
, curl -s http://getcomposer.org/installer | php
und die php composer.phar
erfordert pdepend/pdepend:2.12.0
oder wenn Sie einen global installierten Composer haben.
Andererseits ist PHPMD gegenüber PHP_Depend
vorzuziehen, da es benutzerfreundlicher ist und ein einfach zu konfigurierendes Frontend für Rohmetriken hat, die von PHP_Depend
gemessen werden. Es basiert auf einem bestimmten Quellcode (PHP-Code) und sucht oder versucht, potenzielle Fehler oder Warnungen in dieser Quelle zu finden, da es ein einfaches Arbeitsprinzip hat.
Es kann Bugs und Syntaxfehler, überkomplizierte Ausdrücke, ungenutzte Eigenschaften, Methoden, Parameter und suboptimalen Code leicht erkennen. Als ausgereiftes PHP-Projekt und statischer Code-Analysator bietet PHP Mass Detector eine umfangreiche Bibliothek vordefinierter Regeln zur Analyse des PHP-Quellcodes.
// 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>
Ausgang:
This class has too many properties; consider refactoring it.
Die Verwendung der Befehlszeile des PHP Mess Detectors kann aktiviert oder verwendet werden, indem Sie phpmd [Dateiname|Verzeichnis] [Berichtsformat] [Regelsatzdatei]
eingeben, und es ist möglich, einen Datei-/Verzeichnisnamen an PHPMD
als zu übergeben Container für PHP-Quellcode zur Analyse. Die Parameter codesize.xml
oder rulesets
können wie eine Dateisystemreferenz aussehen, da ihre Phar
-Distribution die Regelsatzdateien in ihrem Archiv enthält.
Darüber hinaus ermöglicht es PHP-Programmierern, verkürzte Namen oder Referenzen zu verwenden, um auf eingebaute Regelsätze wie phpmd
Depend XML codesize zu verweisen. Die Kommandozeilenschnittstelle von PHPMD akzeptiert auch optionale Argumente wie --min-priority
, --report-file
, --suffixes
, --strict
und viele mehr.
Sie können die Konfiguration ~ $ phpmd /path/to/source text codesize
anwenden, indem Sie die mehreren Regelsätze verwenden, die auf den zu testenden Quellcode angewendet werden, und einen Aufruf seiner CLI-Tools mit einem Satznamen ermöglichen. Darüber hinaus ermöglicht es Programmierern eine tiefgreifende Konfiguration, um benutzerdefinierte Regelsatzdateien mit integrierten Regelsätzen zu mischen, und der Befehl ~ $ phpmd /path/to/source text codesize,/my/rules.xml
ist ein perfektes Beispiel davon, um Ihre benutzerdefinierten Regelsätze zur Analyse des Quellcodes anzugeben.
Verwenden Sie das pfff
-Tool, um eine statische Codeanalyse in PHP durchzuführen
Als eine Reihe von APIs und Tools kann es eine statische Codeanalyse durchführen, um Quellcode zu indizieren, zu suchen, zu navigieren, zu visualisieren, umzugestalten und den Stil von Source-to-Source-PHP-Code zu transformieren.
pfff
lässt sich einfach kompilieren und installieren; es erzeugt jedoch Ergebnisse in einem komplexen Format wie go-automatic.php:14:77: CHECK: Use of undeclared variable $goUrl
oder login-now.php:7:4: CHECK: Unused Local variable $title
. Sie erreichen das pfff
auf GitHub mit $ ~/sw/pfff/scheck ~/code/github/sc/
.
Außerdem können Sie die Parsing-Bibliothek in Ihre eigene OCaml
-Anwendung einbetten, indem Sie die Verzeichnisse commons/
und parsing_php/
in Ihr Projektverzeichnis kopieren und ein rekursives make hinzufügen; Am Ende verknüpfen Sie die Anwendung mit der Bibliothek parsing_php/parsing_php.cma
& commons/commons.cma
. Beachten Sie zum besseren Verständnis auch das pfff/demos/Makefile
, und sobald der Quellcode kompiliert ist, können Sie pfff
mit Folgendem testen:
$ 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
Danach müssen Sie auf stdout
einige hilfreiche Informationen zu den Funktionsaufrufen in foo.php
gemäß dem Code in show_function_calls1.m1
im pfff
-Projekt auf den Facebook-Archiven sehen können. Der Parser pfff
ist ausserordentlich produktiv und kann auf der Webseite phpbb
getestet werden.
// 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/
Das pfff
-Programm sollte dann über alle Quellcodedateien (.php
-Quelldateien) iterieren und den Parser für jede Quelldatei ausführen und einige Statistiken ausgeben, die Folgendes zeigen: NB Gesamtdateien = 265; perfekt = 265; =========> 100%
und nb good = 183197, nb bad = 0 =========> 100.000000%
, was bedeutet, dass pfff
100% von Ihnen analysieren konnte PHP-Quellcode.
Als Kommandozeilenprogramm verfügt es über verschiedene Befehle wie pfff
zum Testen der PHP-Sprachparser. Sie können scheck
verwenden, um Fehler zu finden, und es funktioniert wie lint
und stag
für den Emacs-Tag-Generator, der präziser ist als jeder andere.
Das sgrep
ist ein synthetisches grep
, um das Auffinden präziser Codemuster zu erleichtern, und spatch
ist ein syntaktischer Patch, um das Refactoring von PHP-Code zu vereinfachen, sowie codemap
, pfff_db
, codegraph
und codequery
sind einige der neuesten Ergänzungen des pfff
-Tools, um globale Analysen an einer Reihe von Quelldateien durchzuführen oder Informationen über die Struktur Ihrer PHP-Codebasis abzufragen.
Verwenden Sie HHVM
, um eine statische Codeanalyse in PHP durchzuführen
Es verfügt über eine integrierte Proxygen- und FastCGI-Serverunterstützung und kann einer der perfekten statischen Codeanalysatoren sein. HHVM ist als voll funktionsfähiger Webserver mit direkt eingebautem Proxygen bekannt, und seine Benutzerfreundlichkeit und Verarbeitung des Quellcodes machen ihn für die statische Codeanalyse sehr empfehlenswert.
Es verarbeitet schnelle Webanfragen und bietet einen leistungsfähigen Webserver, der dem kombinierten FastCGI
und nginx
entspricht. Sie können hhvm -m server -p 8080
verwenden, um Proxygen zu nutzen, wenn Sie HHVM im Servermodus ausführen, und den Port über die Befehlszeilenkonfiguration festlegen: hhvm.server.port=7777
, oder indem Sie -d hhvm.server.port=7777
in Ihrer server.ini
-Datei platzieren.
Sie können den Befehl -d hhvm.server.type=proxygen
verwenden, um den Proxygen-Servertyp zu definieren, ohne ihn explizit anzugeben (Proxygen ist die Standardeinstellung). Die HHVM-Pakete der init
-Skripte starten standardmäßig im FastCGI
-Modus und erfordern Konfigurationsanpassungen, bevor sie automatisch als Server gestartet werden.
Das Folgende ist ein Beispiel für die HHVM-Paketkonfiguration mit verschiedenen anpassbaren Optionen (server.ini
- oder -d
-Optionen) in der Befehlszeile. Denken Sie daran, dass einige dieser Konfigurationsoptionen optional sind, da sie die Standardwerte sind, aber sie können dazu beitragen, dem Benutzer mehr Informationen zu liefern oder Illustrationen zu zeigen.
// 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
Die Verwendung optionaler Konfigurationsoptionen ist gut für Dokumentationszwecke, um explizit zu sein, und hhvm.server.source_root
und hhvm.server.port
sind höchstwahrscheinlich diejenigen, die explizite Werte benötigen. HH Virtual Machine ist Open Source und in Hack
geschrieben und verwendet eine JIT-Kompilierung (Just-in-Time), um eine überlegene Leistung zu erzielen und gleichzeitig eine außergewöhnliche Entwicklungsflexibilität zu gewährleisten.
Das Standardverzeichnis, in dem die HHVM-Binärdatei gestartet wird, ist default_document
, das Sie basierend auf Ihrem Server ändern können. Nach der Installation von HHVM auf Ihrem Betriebssystem in Ihrem PHP-Projekt können Sie die Befehle sudo update-rc.d hhvm defaults
und sudo service hhvm restart
verwenden, um HHVM so einzustellen, dass es beim Booten als Server gestartet wird.
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