Composer und Autoload über Namespaces

Mit Composer habe ich ein wenig herumexperimentiert – hauptsächlich deshalb, weil man ohne Composer fast keine PHP Libraries mehr verwenden kann.
Interessant ist die Autoload Funktionalität von Composer. Was ist Autoloading?
Bisher war der PHP Code von include und require Ausdrücken zu Beginn einer Klasse gepflastert (Hinzu kommen dann gegebenfalls auch noch use Statements für Namespaces). Wenn man nun eine Erweiterung vorgenommen hat, musste man bei jeder Klasse die include oder require Anweisung ergänzen. Dies soll über Autoloading gelöst werden. Klassen sollen also dynamisch bei Bedarf hinzugeladen werden.
PHP bietet hier schon einiges im Bereich Autoloading z.B.
spl_autoload_register()
oder
__autoload()
Aber richtig zufriedenstellend ist das nicht. Vor allem wenn man den Code in Unterordnern organisiert.
Composer bietet eine Möglichkeit über Namespaces das Autoloading zu erleichtern.

Was ist notwendig?

Zunächst mal muss man Composer installieren.
Dann erstellt man im Verzeichnis, in dem man Arbeiten will, eine Datei composer.json .
Die Ordnerstruktur soll für das Beispiel wie folgt aussehen:

htdocs
- composer_autoload
- - composer.json
- - index.php
- - src
- - - Klasse.php
- - - b
- - - - Klasse.php

Inhalt der PHP Dateien

src/Klasse.php sieht wie folgt aus:

namespace ulrischa;

class Klasse
{
    public $a = 'Ich bin a <br />';

    public function display_a() {
        echo $this->a;
    }

    public function display_b() {
	//Ausgabe von Klasse in b
        $b = new b\Klasse();
	$b->display_b();
    }
}

src/b/Klasse.php sieht so aus:

namespace ulrischa\b;

class Klasse
{
    public $b = 'Ich bin b <br />';

    public function display_b() {
        echo $this->b;
    }	
}

Und index.php so:

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

$a = new ulrischa\Klasse();

//Ausgabe von a
$a->display_a();
//Ausgabe von b über a
$a->display_b();

Hierbei ist require_once __DIR__.'/vendor/autoload.php'; für das Autoloading über Composer zuständig.
Wie man sieht kommen keine includes oder require mehr vor. Neue Klassen können einfach über die Angabe Ihres Klassennamens mit Namespace (full qualified name) verwendet werden, ohne sie vorher über include oder require einubinden.

Einsatz von Composer

Aber damit alles läuft muss man die composer.json noch wie folgt füllen:

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

Hierbei wird der Namespace ulrischa mit dem Dateiverzeichnis src verknüpft. Wenn nun die Klasse aus dem Subnamespace ulrischa\b verwendet wird und diese auch im Unterordener src/b liegt, dann funktioniert auch hier das Autoloading.
Bevor wir den Test über den Browser machen können, muss man in der Console in das Verzeichnis composer_autoload wechseln und folgendes eingeben:

$ composer dump-autoload -o

Hiermit erstellt Composer das Autoloading und ein Aufruf der index.php müsste ergeben:

Ich bin a
Ich bin b 

Der Vorteil ist nun, wenn man eine neue Klasse erstellt hat und diese im bestehenden Code verwenden will, kann man die Klasse einfach nutzen, wenn man die Regeln für die den Namensraum einhält.



2 Antworten zu "Composer und Autoload über Namespaces"

  1. […] … wird das nicht klappen. Aber es funktioniert eigentlich genauso wie beim Autoloading mit Composer. […]

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert