Skip to the content
Documentation
Help Start
Reading in:
  • German: 9,059 of 9,059 pages
About the help in other languages
All help pages

Statische Analyse mit PHPStan

Wie Exponential PHPStan verwendet - Level 1 über kernel/ und lib/ mit einer Baseline der vorhandenen Befunde, was ausgeschlossen ist und warum, die Ausführung lokal und in der CI, einen Befund lesen, ihn beheben statt…

Download as PDF

Address: https://doc.exponential.earth/learninminutes/exphelp/viewer/help/php-developers/static-analysis-with-phpstan.md

On this page

This page is a translation. Read the English original

Statische Analyse mit PHPStan

Diese Seite richtet sich an PHP-Entwickler, die zu Exponential committen oder dasselbe Sicherheitsnetz für eine Erweiterung möchten. PHPStan liest den Code, ohne ihn auszuführen, und meldet Aufrufe nicht existierender Methoden, falsche Argumentanzahlen, undefinierte Variablen und ähnliche Fehler. In Exponential läuft es auf Level 1 mit einer Baseline, sodass nur Befunde fehlschlagen, die Ihre Änderung hinzufügt.

Inhalt

  1. Die Konfiguration
  2. Ausführen
  3. Die Baseline
  4. Einen Befund lesen und beheben
  5. Was ausgeschlossen ist und warum
  6. Ihre Erweiterung analysieren

Die Konfiguration

phpstan.neon.dist:

ParameterWertBedeutung
includesphpstan-baseline.neondie bekannten Befunde, ignoriert
level1undefinierte Variablen, unbekannte Klassen und Methoden, falsche Argumentanzahlen und die Prüfungen von Level 0
phpVersion80100der Code wird als PHP 8.1 analysiert
pathskernel, libwas analysiert wird
excludePathsvendor/*, var/*, */tests/*, kernel/private/classes/commands/*, .../dfs_filter_iterator.phpsiehe unten
bootstrapFilesautoload.phpdie Klassen-Maps, damit PHPStan die Klassen des Kernels findet
tmpDir.devtools/phpstander Ergebnis-Cache
treatPhpDocTypesAsCertainfalseDocblock-Typen leiten die Analyse, aber ein defensives is_array() auf einen als Array dokumentierten Wert ist kein Fehler

Da der Code keine Typdeklarationen hat, stammt das Typwissen von PHPStan aus Docblocks; gute Zeilen @param und @return verbessern die Analyse (Warum der Code keine Typdeklarationen hat).

Ausführen

make devtools          # once: PHPStan into .devtools/ (composer.dev.json), never into vendor/
make phpstan           # .devtools/vendor/bin/phpstan analyse -c phpstan.neon.dist --memory-limit=4G

Der pre-push-Hook führt denselben Befehl aus, sodass ein Push mit einem neuen Befund abgelehnt wird, sofern Sie nicht --no-verify verwenden (Git-Hooks und make-Ziele). In der CI läuft der Job PHPStan des Quality-Workflows unter PHP 8.3 und blockiert.

Die Baseline

phpstan-baseline.neon listet jeden Befund auf, den der Code hatte, als die Prüfung eingeführt wurde (damals 3033), jeweils mit Meldung, Bezeichner, Anzahl und Pfad. Ein Befund in der Baseline wird ignoriert; ein neuer schlägt fehl. Zwei Regeln:

  • Beheben Sie neue Befunde; nehmen Sie sie nicht in die Baseline auf. make phpstan-baseline akzeptiert alle aktuellen Befunde und ist für die seltene Änderung gedacht, die das Level anhebt oder die Baseline neu ordnet, in einer eigenen Änderung.
  • Verkleinern Sie die Baseline, wenn Sie ohnehin in der Datei sind. Wenn Sie einen Befund aus der Baseline beheben, passt PHPStan diesen Eintrag nicht mehr an; reportUnmatchedIgnoredErrors: false verhindert, dass das fehlschlägt, und eine spätere Neuerzeugung der Baseline entfernt den Eintrag.

Einen Befund lesen und beheben

Ein Befund nennt die Datei, die Zeile, die Meldung und einen Bezeichner:

 ------ ------------------------------------------------------------
  Line   extension/acmereport/classes/acmereportservice.php
 ------ ------------------------------------------------------------
  42     Call to an undefined method acmeReportItem::fetchByOwner().
         method.notFound
 ------ ------------------------------------------------------------
Häufige MeldungÜbliche UrsacheLösung
Variable $x might not be definednur in einem Zweig zugewieseninitialisieren Sie sie vor dem Zweig
Call to an undefined methodein Tippfehler oder eine Methode einer anderen Klasseverwenden Sie die richtige Methode; prüfen Sie kernel/classes/
... invoked with 3 parameters, 2 requireddie Signatur hat sich geändertpassen Sie den Aufruf an
Access to an undefined propertyeine dynamische Eigenschaftdeklarieren Sie sie in der Klasse
Instantiated class X not foundein fehlender Eintrag in der Klassen-Map oder ein Tippfehlergenerieren Sie die Autoloads neu; korrigieren Sie den Namen

Viele Befunde der Form Variable $Params might not be defined in der Baseline stammen aus View-Dateien, die $Params von eZProcess::runFile() erhalten. Die klassenbasierten Views (Exponential\Runnable\ModuleView) nehmen sie stattdessen aus $scope und haben das Problem nicht (Modul-Views als Klassen).

Was ausgeschlossen ist und warum

PfadGrund (aus phpstan.neon.dist)
vendor/*, var/*Code von Drittanbietern und generierter Code
*/tests/*Tests werden geprüft, indem man sie ausführt
kernel/private/classes/commands/*Befehlsklassen, die auch globale Hilfsfunktionen deklarieren; zwei davon in einem Analyseprozess zu laden deklariert sie erneut
kernel/private/classes/clusterfilehandlers/dfsbackends/dfs_filter_iterator.phpseinen Iterator-Methoden fehlen die vorläufigen Rückgabetypen von PHP 8.1 oder #[\ReturnTypeWillChange], was PHPStan nicht in die Baseline aufnehmen kann

Ihre Erweiterung analysieren

PHPStan ist nicht auf den Kernel beschränkt. Mit installierten Entwicklungswerkzeugen richten Sie es mit einer kleinen eigenen Konfiguration, die den Autoloader des Kernels bootstrapt, auf Ihre Erweiterung:

# extension/acmereport/phpstan.neon
parameters:
    level: 1
    paths:
        - .
    excludePaths:
        - tests/*
    bootstrapFiles:
        - ../../autoload.php
.devtools/vendor/bin/phpstan analyse -c extension/acmereport/phpstan.neon --memory-limit=2G

Generieren Sie zuerst die Autoloads neu (php bin/php/ezpgenerateautoloads.php -e), damit Ihre eigenen Klassen bekannt sind. Beginnen Sie wie der Kernel auf Level 1 und heben Sie das Level an, wenn die Befunde verschwunden sind.

Verwandte Seiten

Werden Sie Exponential-Partner

Partner teilen ihre Informationen, stellen Mittel bereit, geben Beiträge zurück und entwickeln die Produkte mit uns, und so wächst Exponential. Eine Partner-Website und ein Dashboard sind für Mitte 2027 geplant: Werden Sie noch heute Partner, damit wir schneller wachsen und neue Funktionen früher liefern.

Something wrong on this page? Report an error

Documentation license

This documentation is free documentation, licensed under the GNU Free Documentation License 1.3 or later.

Exponential Copyright © 1998-2026 Exponential Foundation and 7x