Source: Unsplash

PSR-4-konformes Autoloading mit Composer – PHP

Die nachfolgende Anleitung vermittelt leicht verständlich die Einsatzvorteile des PHP Dependency Managers Composer beim Autoloading von Klassen. 

Es findet unter anderem der von der PHP Framework Interop Group (PHP-FIG) definierte PSR-4 Standard Anwendung, dessen genaue Spezifikation unter folgendem Link verfügbar ist. https://www.php-fig.org/psr/psr-4/

1. Erläuterung des PSR-4 Standards

Der PSR-4 Autoloading Standard ist ein PSR Standard der das Autoloading von Klassen über den Dateipfad spezifiziert. Genauer gesagt soll dabei der verwendete Namespace einer Klasse mit dem Dateipfad übereinstimmen.

\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>

Aus dem voll qualifizierten Klassennamen

\ExampleCompany\Core\Request

resultiert daher folgender Dateipfad

/ExampleCompany/Core/Request.php

2. Installation des Dependency Managers "Composer"

Die einfachste Möglichkeit, Composer lokal unter Windows zu installieren ist, auf der offiziellen Composer Download Webseite die Composer-Setup.exe Datei herunterzuladen.

Vor der Installation sollte man sich allerdings vergewissern, dass PHP bereits auf dem Betriebssystem installiert ist, da der Composer Setup Wizzard während der Installation nach dem Installationsverzeichnis von PHP fragen wird. Sollte PHP noch nicht lokal installiert sein, so geht dies am einfachsten durch die Installation von XAMPP, einer beliebten PHP-Entwicklerumgebung, die neben PHP auch MariaDB/MySQL und Apache bereitstellt. 

Um zu überprüfen, ob Composer erfolgreich global installiert werden konnte, kann man folgenden Befehl im Windows Terminal ausführen:

$ composer --version

Die folgende Ausgabe (variable Platzhalter für Versionsnummer Datum und Zeit enthalten) zeigt, dass Composer fehlerfrei installiert werden konnte und funktionsfähig ist:

> Composer version x.x.x YYYY-MM-DD HH:MM:SS

3. Verwendung von Composer

3.1. Implementierung der PSR-4 konformen Verzeichnisstruktur

Das grundlegende Projektstammverzeichnis gemäß dem PSR-4 Standard besteht aus folgenden Komponenten:

File/DirectoryTypeErforderlichBeschreibung
composer.jsonKonfigurationsdateiKonfigurationsdatei, die die Abhängigkeiten eines Projekts beschreibt und auch andere Metadaten enthalten kann.
src/{Untehmensname}VerzeichnisQuellverzeichnis, welches die im Projekt verwendeten Klassen gemäß PSR-4 Standard enthält.
index.phpPHP-DateiOPTIONALPHP-Datei, in welcher die durch Composer generierte vendor/autoload.php Datei eingefügt wird.

Die Verzeichnisstruktur die nachfolgend Anwendung findet, sieht wie folgt aus:

<Your Project>
├── src
│   ├── ExampleCompany
      ├── ...
├── index.php
├── composer.json

3.2. Setup der composer.json Datei

Die nachfolgende composer.json Datei entspricht dem Mindeststandard und implementiert die im Abschnitt 3.1. dargestellte Verzeichnisstruktur.

{
"autoload": {
"psr-4": {
"ExampleCompany\\": "src/ExampleCompany"
}
}
}

Erläuterungen:

Composer registriert einen PSR-4-Autoloader für den ExampleCompany-Namensraum.

Es wird ein Mapping von Namensräumen auf Verzeichnisse definiert. Das src-Verzeichnis befindet sich im Projektstamm, auf der gleichen Ebene wie das später durch Composer generierte Vendor-Verzeichnis. Ein Beispieldateiname wäre src/Foo.php mit einer ExampleCompany\Foo-Klasse.

4. Erstellung einer Beispielklasse mit anschließendem Autoloading

Nachfolgend soll die Beispielklasse Foo erstellt und in der übergeordneten index.php Datei aufgerufen werden. 

Hierzu muss im Verzeichnis src/ExampleCompany die Datei Foo.php erstellt werden. Hierbei muss beachtet werden, dass der Name der Klasse, und der Dateiname immer übereinstimmen müssen, da Composer die Klasse sonst nicht finden und demnach auch nicht automatisch laden kann.

Der Inhalt der Datei Foo.php muss folgenden Programmcode umfassen:

 <?php
namespace ExampleCompany;

class Foo {

  /**
* Your code goes here ...
*/

}
?>

Erläuterungen:

Der Namespace muss immer den aktuellen Dateipfad wiederspiegeln. Da die Datei Foo.php mit der Klasse Foo sich im Verzeichnis src/ExampleCompany befindet, muss der Namespace ExampleCompany lauten.

Würde sich die Datei Foo.php mit der Klasse Foo im Verzeichnis src/ExampleCompany/Subdirectory befinden, so müsste der Namespace entsprechend ExampleCompany/Subdirectory lauten.

5. Einbinden des Autoloaders inklusive der Instanzierung der Klasse Foo

Nachdem die Klasse Foo im Verzeichnis src/ExampleCompany erstellt wurde, kann mit dem Aufsetzen der index.php fortgefahren werden.

Hierzu muss zuerst im Projektstammverzeichnis der Composer Befehl $ composer dump-autoload -o im Windows Terminal ausgeführt werden, der die Datei vendor/autoload.php erstellt. Anschließend kann der Autoloader in der index.php Datei registriert werden. Dazu ist es lediglich erforderlich, die vendor/autoload.php mit require einzubinden. 

Anschließend kann eine neue Instanz der Klasse Foo erstellt werden. Der Programmcode der index.php Datei sollte nunmehr wie folgt aussehen.

<?php
require_once __DIR__ . '/vendor/autoload.php';

$Foo = new \ExampleCompany\Foo();
?>

Optimierungsmöglichkeiten:

Da die Verwendung des vollständigen Namespace langfristig zu schlechter lesbaren Quellcode führen kann, ist es möglich diesen durch die Verwendung eines Namespace-Alias auch wegzulassen. Dabei findet der use-Operator Anwendung.

Die index.php würde wie folgt abgeändert werden:

<?php
use \ExampleCompany\Foo as Foo;

require_once __DIR__ . '/vendor/autoload.php';

$Foo = new Foo();
?>

Comments