Lehrer zeigt auf Tafel mit PHPStan Logo

PHP für Fortgeschrittene: PHPStan & CS Fixer

Als fortgeschrittener bzw. Senior PHP-Entwickler lernt man nie aus. Es gibt immer neue Versionen und neue Werkzeuge, um die Qualität der PHP-Projekte zu steigern und die Arbeit der Entwickler zu erleichtern.

Stellvertretend hierfür stelle ich dir in diesem Artikel PHPStan und den PHP Coding Standards Fixer vor. Beide Tools lassen sich mit wenig Aufwand installieren und in deine Veröffentlichungsstrategie integrieren.

Die einzige Voraussetzung ist, dass du dich mit PHP bereits auskennst und Begriffe wie Composer dir vertraut sind. Falls du PHP lernen möchtest, schau in unserem Artikel für den Einstieg in PHP vorbei.

PHPStan

PHPStan ist ein Open Source Werkzeug zur statischen Code Analyse. Das bedeutet, du kannst deinen Code testen ohne eigene Tests zu schreiben. Somit gewinnt dein Code an Qualität und du vermeidest Fehler. Probiere es einfach mal online aus.

Logo von PHPStan (PHP Elefant mit Lupe)

Logo PHPStan

Installieren und Ausführen von PHPStan

Zum Installieren von PHPStan benötigst du Composer. Führe folgende Zeile in deiner Konsole aus:

composer require --dev phpstan/phpstan

Nun kannst du deine erste Analyse starten.

vendor/bin/phpstan analyse pfad/zu/meinen/php-dateien

Die Ausgabe kann dann wie in diesem Video aussehen:

Info Icon

Dieses Video wird über eine externe Plattform (YouTube) gehostet. Das Laden bedarf der Zustimmung unserer Datenschutzbestimmungen.

Einstellung vornehmen

Eventuell bist du schon überrascht, was PHPStan hier findet. Dabei waren dies nur die grundlegenden Tests.

Levels in PHPStan

PHPStan hat die Regelwerke in verschiedenen Level zusammengefasst. Hast du keine Level explizit angegeben, so läuft Level 0.

Derzeit geht PHPStan bis Level 9. Eine aktuelle Übersicht der Level findest du in der Dokumentation.

Wählst du ein höheres Level, so sind alle bis dahin automatisch enthalten. Legst du Level 5 fest, so werden auch Level 0 bis 4 überprüft.

Um ein anderes Level als 0 zu wählen, gibst du dieses als Parameter (-l) an. Mit max gibst du maximale Level (9) an.

vendor/bin/phpstan analyse -l 5 pfad/zu/meinen/php-dateien

Nun werden dir eventuell mehr Fehler angezeigt. Damit du das Level und den Pfad nicht jedes Mal explizit nennen musst, kannst du eine Konfigurationsdatei anlegen.

phpstan.neon Konfigurationsdatei

Sobald du eine Konfigurationsdatei angegeben hast, muss in dieser auch ein Level definiert sein. Du kannst den Pfad zur Konfigurationsdatei explizit angeben. Falls nicht, schaut PHPStan nach den folgenden Dateien in deinem aktuellen Arbeitsverzeichnis:

  • phpstan.neon
  • phpstan.neon.dist
  • phpstan.dist.neon

Wir legen eine phpstan.neon-Datei an und können hier weitere Parameter festlegen sowie weitere Konfigurationsdateien einbinden.

includes:
  - Build/more.neon

parameters:
  level: 5
  paths:
    - pfad/zu/meinen/php-dateien
    - pfad/zu/weiteren/php-dateien

Jetzt musst du in der Konsole nichts weiter angeben.

vendor/bin/phpstan analyse

Die PHPStan Baseline

Gerade am Anfang kann einen die Menge an Fehlern erschlagen. Oder du sagst die Fehler im aktuellen Level sind in Ordnung und du möchtest gerne ins nächste Level aufsteigen. Um deine aktuelle Codebasis als gegeben festzulegen, kannst du eine Baseline erzeugen. Damit wird eine Konfigurationsdatei erzeugt, in welcher festgelegt wird, dass alle aktuellen Fehler zu ignorieren sind.

Damit die Baseline erzeugt wird, musst du lediglich einen Parameter angeben: –generate-baseline bzw. -b.

vendor/bin/phpstan analyse -b

Du kannst optional einen Pfad bzw. Dateinamen angeben. Falls nicht, erzeugt PHPStan die Datei phpstan-baseline.neon. Diese Datei kannst du nun in deiner phpstan.neon einbinden.

includes:
    - phpstan-baseline.neon

parameters:
    ...

Mehr Informationen zu PHPStan findest du in der offiziellen Dokumentation. Das folgende Video bringt dir das Tool auch nochmal näher:

Info Icon

Dieses Video wird über eine externe Plattform (YouTube) gehostet. Das Laden bedarf der Zustimmung unserer Datenschutzbestimmungen.

Einstellung vornehmen

PHPStan Extensions

PHPStan kann beliebig erweitert werden. Für weitverbreitete Frameworks und Systeme gibt es bereits vorgefertigte Regeln, u.a.:

PHP Coding Standards Fixer

PHP Coding Standards Fixer (kurz: PHP CS Fixer) ist ebenfalls ein statisches Analyse-Tool. Der Fokus liegt hier weniger darauf, Fehler zu beheben, sondern die PHP Coding Standards einzuhalten. Das bringt u.a. den Vorteil, dass ihr im Team einheitliche Code-Styles verwendet und einzelne Abweichungen nicht unnötig im Git landen.

Installieren und Ausführen von PHP CS Fixer

Die Installation kann auch wieder über Composer erfolgen. Wir schauen uns hier an, wie er für das aktuelle Projekt installiert wird. Dazu führe diese Befehle in der Konsole aus.

mkdir --parents tools/php-cs-fixer
composer require --working-dir=tools/php-cs-fixer friendsofphp/php-cs-fixer

Das Tool kann auch Global und ohne Composer installiert werden. Mehr dazu findest du in der Dokumentation.

Zum Ausführen kannst du nun folgenden Code ausführen.

tools/php-cs-fixer/vendor/bin/php-cs-fixer fix pfad/zu/meinen/php-dateien --dry-run --verbose --using-cache no

Mit den Parametern –dry-run und –verbose werden keine Änderungen an deinem Code vorgenommen und die Regeln angezeigt, welche in den jeweiligen Dateien angewandt werden. Die Ausgabe könnte wie folgt aussehen:

Info Icon

Dieses Video wird über eine externe Plattform (YouTube) gehostet. Das Laden bedarf der Zustimmung unserer Datenschutzbestimmungen.

Einstellung vornehmen

Regeln für den CS Fixer

Mit dem Parameter –rules kannst du Regeln definieren, auf welche geprüft werden soll. Wenn du diesen Parameter nicht angibst, werden die PSR-12 Regeln angewandt.

Eine Übersicht der Regeln findest du hier. Für Symfony kannst du beispielsweise --rules=@symnfonynutzen.

Darüber hinaus kannst du in deinem Projekt eine .php-cs-fixer.php legen. Ist kein rules-Parameter gesetzt, wird diese Datei genutzt.

Für TYPO3 findest du diese Datei auf GitHub oder du nutzt das Composer Paket für die TYPO3 Coding Standards.

<?php 

return (new \PhpCsFixer\Config())
    ->setRiskyAllowed(true)
    ->setRules([
        '@DoctrineAnnotation' => true,
        '@PSR2' => true,
        'array_syntax' => ['syntax' => 'short'],
        'blank_line_after_opening_tag' => true,
        'braces' => ['allow_single_line_closure' => true],
        'cast_spaces' => ['space' => 'none'],
        'compact_nullable_typehint' => true,
        'concat_space' => ['spacing' => 'one'],
        'declare_equal_normalize' => ['space' => 'none'],
        'dir_constant' => true,
        'function_to_constant' => ['functions' => ['get_called_class', 'get_class', 'get_class_this', 'php_sapi_name', 'phpversion', 'pi']],
        'function_typehint_space' => true,
        'lowercase_cast' => true,
        'method_argument_space' => ['on_multiline' => 'ensure_fully_multiline'],
        'modernize_strpos' => true,
        'modernize_types_casting' => true,
        'native_function_casing' => true,
        'new_with_braces' => true,
        'no_alias_functions' => true,
        'no_blank_lines_after_phpdoc' => true,
        'no_empty_phpdoc' => true,
        'no_empty_statement' => true,
        'no_extra_blank_lines' => true,
        'no_leading_import_slash' => true,
        'no_leading_namespace_whitespace' => true,
        'no_null_property_initialization' => true,
        'no_short_bool_cast' => true,
        'no_singleline_whitespace_before_semicolons' => true,
        'no_superfluous_elseif' => true,
        'no_trailing_comma_in_singleline_array' => true,
        'no_unneeded_control_parentheses' => true,
        'no_unused_imports' => true,
        'no_useless_else' => true,
        'no_whitespace_in_blank_line' => true,
        'ordered_imports' => true,
        'php_unit_construct' => ['assertions' => ['assertEquals', 'assertSame', 'assertNotEquals', 'assertNotSame']],
        'php_unit_mock_short_will_return' => true,
        'php_unit_test_case_static_method_calls' => ['call_type' => 'self'],
        'phpdoc_no_access' => true,
        'phpdoc_no_empty_return' => true,
        'phpdoc_no_package' => true,
        'phpdoc_scalar' => true,
        'phpdoc_trim' => true,
        'phpdoc_types' => true,
        'phpdoc_types_order' => ['null_adjustment' => 'always_last', 'sort_algorithm' => 'none'],
        'return_type_declaration' => ['space_before' => 'none'],
        'single_quote' => true,
        'single_line_comment_style' => ['comment_types' => ['hash']],
        'single_trait_insert_per_statement' => true,
        'trailing_comma_in_multiline' => ['elements' => ['arrays']],
        'whitespace_after_comma_in_array' => true,
        'yoda_style' => ['equal' => false, 'identical' => false, 'less_and_greater' => false],
    ])
    ->setFinder($finder);

Weitere PHP Tools für Fortgeschrittene

PHPStan und der PHP Code Style Fixer sind längst nicht alle Tools, welche ein erfahrener PHP-Programmierer kennen sollte.

PHPUnit & CodeCeption

Eigene Tests zu schreiben fordert die Stabilität eines Projekts und gibt dem Entwickler Sicherheit. Für Unit-Tests empfiehlt sich PHP-Unit, für größere Akzeptanz-Tests Codeception.

Rector PHP

Rector PHP bietet software-spezifische CodeAnalysen und kann so u.a. Updates beschleunigen. Hier findest einen Artikel zu Rector in Verbindung mit TYPO3.

Continuous Integration und Deployment

Ein weiteres Feld ist das Thema Continuous Integration und Deployment, also wie du deinen Code veröffentlichst und welche Schritte und Tests dabei absolviert werden. Software die sich hierfür anbieten sind Deployer PHP sowie die GitLab CI. Die bisher vorgestellten PHP Tools können Teil von deiner Veröffentlichungsstrategie sein.

Ausblick

Wenn du ein Werkzeug hier vermisst, dann nenne es gerne in unseren Kommentaren. Was die Helferlein mit deinem PHP-Code anstellen würden, kannst du direkt online testen.

Du willst diese Tools in der Praxis zu nutzen? Dann wirf mal einen Blick auf unsere Stellenangebote. Nimm unkompliziert und ohne Lebenslauf Kontakt zu uns auf. Wir freuen uns auf dich.

 

Kommentar hinzufügen

Deine E-Mail-Adresse wird nicht veröffentlicht.