So analysieren Sie PHP-Projekte statisch mit PHPStan

0
169

PHPStan ist ein statisches Analysesystem für PHP-Projekte. Es findet Fehler in Ihrer Codebasis, indem es die Quelldateien untersucht. Sie müssen Ihren Code nicht ausführen oder manuell Tests schreiben, um Probleme zu erkennen!

Der Begriff “statische Analyse” ist als Debugging-Code definiert, ohne ihn tatsächlich auszuführen. Es wird am häufigsten mit interpretierten Sprachen wie PHP verwendet, da die gefundenen Probleme in der Kompilierungsstufe in kompilierten Sprachen auftauchen.

Statische Analysen liefern in der Regel die besten Ergebnisse, wenn sie in eine gut strukturierte, stark typisierte Codebasis. Die Dokumentation zu PHPStan weist darauf hin, dass “moderner objektorientierter Code” wird am meisten profitieren, da diese Projekte PHPStan mehr Informationen zum Arbeiten geben.

PHPStan zu Ihrem Projekt hinzufügen

Um PHPStan auszuführen, benötigen Sie PHP 7.1 oder neuer. Diese Anforderung gilt nur für die PHP-Version, mit der PHPStan selbst ausgeführt wird. Das Tool kann Quelldateien analysieren, die auf ältere PHP-Versionen abzielen.

Es wird empfohlen, Composer zu verwenden, um PHPStan als Abhängigkeit hinzuzufügen:

composer require –dev phpstan/phpstan

Die PHPStan-Binärdatei wird Ihrem Projekt unter Vendor/bin/phpstan hinzugefügt. Sie können es jetzt zum ersten Mal verwenden, um Ihre Codebasis zu analysieren:

Vendor/bin/phpstan analyze src

Der oben gezeigte Befehl führt die Tests von PHPStan für alle Quelldateien in Ihrem src-Verzeichnis aus. Je nach Größe Ihrer Codebasis kann dies einige Minuten dauern.

< /p>

Sie sehen ein grünes “[OK] Keine Fehler” Nachricht, wenn alle Tests bestanden. Andernfalls wird die Liste der aufgetretenen Fehler angezeigt. Befolgen Sie die angezeigten Anleitungen, um jeden Fehler zu beheben, bevor Sie PHPStan erneut ausführen.

Fehlertypen und -stufen

PHPStan enthält eine Vielzahl von Prüfungen, die eine Vielzahl von möglichen Codebasis-Problemen. Zu den am häufigsten auftretenden Problemen gehören die folgenden:

  • Probleme mit dem Eingabesystem– Einer typisierten Eigenschaft einen ungültigen Wert zuweisen oder falsch typisierte Parameter an eine Methode übergeben. Dies schließt auch Vertragsprobleme ein, z. B. eine Klasse, die eine Schnittstelle falsch implementiert.
  • Funktionsaufrufe – Übergeben von zu vielen oder nicht ausreichenden Parametern beim Aufruf einer Funktion oder Methode (z. B. 3 statt 4).
  • Unbekannte Klassen, Methoden und Funktionen – Der Versuch, etwas zu verwenden, das nicht in der Codebasis vorhanden ist.
  • Zugriff auf undefinierte/möglicherweise undefinierte Variablen– Der Versuch, eine Variable zu verwenden, die nicht in einem bestimmten Bereich definiert ist oder die möglicherweise nicht immer einen Wert hat, aber in einem Kontext verwendet wird, in dem ein Wert angenommen wird.
  • Dead Code Checking – Kennzeichnung von nutzlosem Code, z. B. boolesche Vergleiche, die immer zum gleichen Wert aufgelöst werden, und Codeverzweigungen, die nie ausgeführt werden (z. B. Code nach einer return-Anweisung innerhalb von Funktionen).

Die Regeln sind in 9 verschiedene “Level” sortiert, die von 0 bis 8 gekennzeichnet sind. Das spezielle Level max fungiert als Alias ​​für das höchstmögliche Level. Im Laufe der Zeit kann PHPStan weitere numerische Ebenen hinzufügen, sodass Sie durch die Verwendung von max immer die strengsten Prüfungen erhalten.

Standardmäßig führt PHPStan Level 0 aus. Dies beinhaltet nur die grundlegendsten Tests. Es ist eine gute Idee, Ihre Codebasis jedes Level einzeln durchlaufen zu lassen, bevor Sie zum nächsten übergehen. Ausgereifte Projekte werden wahrscheinlich mit jedem neuen Level auf andere Probleme stoßen.

Werbung

Um die von PHPStan verwendete Ebene zu ändern, können Sie den Befehlszeilenparameter –level übergeben:

vendor/bin/phpstan analyze src –level 8

Zusätzlich zum eingebauten Checks sind PHPStan-Erweiterungen verfügbar, um noch mehr Funktionalität hinzuzufügen. Sie können auch Ihre eigenen Regeln von Grund auf neu schreiben. Dies ist nützlich, wenn Sie Funktionen verwerfen, die Entwickler nicht mehr in neuem Code verwenden sollten. Wir werden das Erstellen benutzerdefinierter Regeln in einem zukünftigen Artikel behandeln.

PHPStan konfigurieren

Über die anfänglichen Experimente hinaus kann die Verwendung der Befehlszeilenschnittstelle von PHPStan schnell ermüdend werden. Am besten fügen Sie Ihrem Projekt eine Konfigurationsdatei hinzu, die dann in die Quellcodeverwaltung übernommen werden kann, damit alle Ihre Entwickler sie verwenden können.

PHPStan verwendet das Neon-Konfigurationsdateiformat, dessen Syntax YAML sehr ähnlich ist. Erstellen Sie eine phpstan.neon-Datei im Stammverzeichnis Ihres Projekts. Diese Datei wird automatisch geladen, wenn PHPStan gestartet wird, sodass Sie den Befehl analysis jetzt ohne weitere Argumente ausführen können:

Vendor/bin/phpstan analyze

Um die verwendete Konfigurationsdatei zu überschreiben, übergeben Sie das Flag –configuration :

Vendor/bin/phpstan analysis –configuration /phpstan-config.neon

Sie müssen nun Ihre phpstan.neon-Datei mit etwas Inhalt füllen. Ein guter Ausgangspunkt könnte so aussehen:

Parameter: Level: 0 Pfade: – src Werbung

Diese grundlegende Konfigurationsdatei sollte dieselbe Ausgabe wie der zuvor gezeigte Befehlszeilenaufruf liefern. Sie können im Abschnitt Pfade zusätzliche Verzeichnisse hinzufügen, die als neue Zeilen gescannt werden sollen. Um Dateien und Verzeichnisse auszuschließen, fügen Sie sie zu einem excludes_analyse-Blatt innerhalb desselben Parameterabschnitts hinzu.

Ignorieren von Fehlern

Gelegentlich kann PHPStan ein Problem auftauchen, das unvermeidlich. Wenn ein Problem nicht sofort behoben werden kann, können Sie es ignorieren, damit die Tests bestanden werden.

Dies ist besonders wichtig, wenn Sie zu einer anderen Überprüfungsebene aufsteigen möchten oder PHPStan in einer CI-Umgebung verwenden, in der eine fehlgeschlagene Ausführung die Bereitstellung Ihres Builds stoppt. Trotzdem sollten Sie diese Vorgehensweise nicht auf die leichte Schulter nehmen – Sie sollten einen gemeldeten Fehler nur ignorieren, wenn Sie sicher sind, dass dies sicher ist.

Nachdem Sie die Entscheidung getroffen haben, fügen Sie den Parametern Ihrer Konfigurationsdatei einen neuen Abschnitt ignoreErrors hinzu. Sie müssen die zu vergleichende Nachricht als Regex und die Pfade definieren, um den Ausschluss anzuwenden auf:

Parameter: Ebene: 0 Pfade: – src ignoreErrors: – Nachricht: '/Return-Typ-String der Methode ExampleClass:: example() ist nicht kovariant(.*).' path: src/ExampleClass.php

Sie können Pfade optional als ein Array von Pfaden angeben und den oben gezeigten einzelnen Pfadschlüssel ersetzen.

Optionale Regeln

< p>Die Strenge von PHPStan kann durch eine Reihe von Konfigurationsvariablen angepasst werden. Diese ermöglichen Ihnen, die durchgeführten Prüfungen außerhalb des oben beschriebenen Stufensystems zu verfeinern. Einige davon sind potenziell umstritten oder stimmen wahrscheinlich nicht mit allen privaten Styleguides überein, daher sind sie standardmäßig deaktiviert.

Einige Einstellungen, die es wert sein könnten, aktiviert zu werden, sind:

  • checkAlwaysTrueInstanzvon – Kennzeichnet die Verwendung von instanceof, die immer als wahr ausgewertet wird.
  • checkAlwaysTrueStrictComparison – Flags, wenn ein Ausdruck, der === oder !== verwendet, immer als wahr ausgewertet wird.
  • checkFunctionNameCase – Stellt sicher, dass die Groß-/Kleinschreibung von Funktionsnamen ihrer Definition entspricht, wenn sie in der gesamten Codebasis aufgerufen werden.
  • verschmutzenScopeWithLoopInitialAssignments – Wenn auf false gesetzt (standardmäßig ist es wahr), wird verhindert, dass Variablen, die in anfänglichen Schleifenanweisungen deklariert wurden (z. B. $i in $for ($i = 1; $i < 10; $i++)) von außen zugegriffen werden. den Codeblock der Schleife, um eine mögliche Verschmutzung des übergeordneten Geltungsbereichs zu vermeiden.
  • reportStaticMethodSignaturen – Erzwingt eine vollständige Typprüfung für Parameter und Rückgabetypen in statischen Methoden, wenn sie von einer untergeordneten Klasse überschrieben werden.

Werbung

Vollständige Details zu diesen optionalen Einstellungen – und viele mehr – finden Sie in der Konfigurationsreferenz von PHPStan.

Schlussfolgerung

Das ist das Ende unserer Einführung in PHPStan. Es hilft Ihnen, Vertrauen in Ihre Codebasis zu haben, und hebt mögliche Probleme hervor, bevor sie zu einem Problem in der Produktion werden.

PHPSan ist so schnell einzurichten, dass es wirklich keinen Grund gibt, es nicht zu verwenden, insbesondere wenn Sie arbeiten mit einer modernen stark typisierten Codebasis. Lassen Sie sich jedoch nicht zu der Annahme verleiten, dass es manuelle Tests ersetzen kann. PHPStan kann eine große Auswahl an Prüfungen vorweisen, kann jedoch keine logischen Probleme erkennen und versteht die Geschäftsregeln Ihres Projekts nicht. Es ist lediglich ein weiterer Vorteil in Ihrer Toolbox bei der Bewertung des Zustands einer Codebasis und dient neben vertrauenswürdigen Begleitern wie Komponententests und End-to-End-Funktionstests.