Composer PSR-4 und PSR-0 - Unterschied?

04. Januar 2014 Web-Entwicklung von Eric Kubenka

Composer ist die Abhängigkeitsverwaltung für PHP schlecht hin. Wer aktuell große PHP Projekte mit zahlreichen Abhängigkeiten zu Frameworks und anderen Bibliotheken umsetzt, wird vermutlich auf Composer als Dependency Manager und Autoloader setzen.

Die wohl meist verwendete Autoload-Variante in Composer ist aktuell PSR-0. Dabei werden Klassen auf Basis der Ordnerstruktur, beziehungsweise der Dateipfad-Struktur geladen und automatisch in den entsprechenden Namespaces bereitgestellt. Seit gestern bietet Composer nun auch die Möglichkeit den bereits vorgestellten, aber noch nicht akzeptierten, PSR-4-Standard zu nutzen. Was die Unterschiede sind und wie die Verzeichnisstruktur nun auszusehen hat, wenn man PSR-4-Autoloading nutzen möchte, will ich kurz aufzeigen.

 

PSR-0 - huh?

Zu Beginn möchte ich jedoch auf die Anwendung des PSR-0-Standard in Composer eingehen. Angenommen man hat als Abhängigkeit im eigenen Projekt die Klasse Illuminate\Http\Reponse dann wird der Pfad zu dieser Datei wie folgt aufgebaut. path/to/my/application/vendor/illuminate/http/Illuminate/Http/Response.php

Auffallend hier ist die Dopplung des Vendor-Namens, in diesem Fall Illuminate, sowie die Dopplung des Package-Namens, in diesem Fall Http. Das macht die Pfade etwas unübersichtlich und eigentlich ist es auch überflüssig.

 

PSR-0 und PSR-4 - Wo ist der Unterschied?

Genau dieser Meinung, nämlich dass diese Dopplung überflüssig sei, waren anscheinend auch andere schlaue Köpfe und entwarfen daher den PSR-4-Standard, welcher darauf abzielt diese Dopplung von Vendor- und Package-Namen zu vermeiden. Der Pfad mit Composer sieht und PSR-4 sieht dann wie folgt aus. path/to/my/application/vendor/illuminate/http/Response.php

 

PSR-4 in Composer für eigene Projekte nutzen

Doch wie nutzt man den PSR-4-Autoloader nun in Composer? Naja ganz einfach. Statt psr-0 wird psr-4 angegeben und das Mapping bleibt identisch. Eine Beispiel composer.json-Datei.

{
    "name": "codefever/psr4example",
    "description": "Example for",
    "authors": [
        {
            "name": "Eric Kubenka",
            "email": "info@code-fever.de"
        }
    ],
    "require": {
        "illuminate/http": "4.1.*"
    },
    "autoload": {
        "psr-4": {
            "Example\\": "src/"
        }
    },
    "minimum-stability": "dev"
}

Eine bespielhafte Dateistruktur sieht dann wie folgt aus, wobei hier der Bereich im Ordner src/ entsprechend dem konfigurierten PSR-4-Autoloading geladen wird. Die composer.json-Datei bezieht sich also darauf. Weiterhin habe ich im Verzeichnisbaum noch ein mal die Unterschiede zwischen PSR-0 und PSR-4 aufgezeigt.

Das ganze gibt es auch bei GitHub zum durchklicken.

src/
	Connection/
		Connector.php
	MyExample.php
vendor/
	illuminate/
		http/ #Die hier vorhande Dopllung basiert auf dem PSR-0-Autoloading von diesem Paket
			Illuminate/
				Http/
					Response.php 
    illuminate/
    	http/ #Das wäre das Pendant in PSR-4
    		Response.php

Zurück