Composer verstehen - Teil 5 - Autoloading

von Marco Simbürger

Vorweg: wem Autoloading nichts sagt, sollte zuerst diesen Artikel lesen: PHP Autoloading

Das Composer-Autoloading kann auf zwei Arten funktionieren: durch direktes Autoloading der Klassen oder durch die Verwendung der PSR-Standards.

Der simpelste Weg ist jede Klasse einzeln zu laden. Dazu müssen wir die Pfade zu den Klassen in der composer.json Datei definieren.

Ein Beispiel:

{
  "autoload": {
    "classmap": [
      "path/to/ExampleClass.php",
      "path/to/example_directory"
    ]
  }
}

Mit diesem Classmap-Autoloading haben wir aber nicht viel anderes als eine lange Liste an Klassen, wie es früher direkt in den PHP-Scripten gemacht wurde. Der bessere Weg fürs Autoloading ist die Verwendung des PSR-4-Standards.

PSR-4 ist der neueste Standard fürs Autoloading in PHP und zwingt uns Namespaces zu verwenden. Folgendes, einfaches Beispiel soll zeigen, wie das funktioniert.

Wir müssen die nachfolgenden Schritte unternehmen, um unsere Klassen mit PSR-4 laden zu können.

Als erstes erstellen wir einen Projektordner my_example. Darin erstellen wir eine composer.json, index.php und ein Unterverzeichnis src/, in dem wir die Klassen erstellen, die wir anschliessend laden möchten. Zudem erstellen wir in src/ ein weiters Unterverzeichnis namens Plugin. Die Dateistruktur sieht dann wie folgt aus:

my_example/
   composer.json
   index.php
   src/
      Example.php
      Plugin/
         ExamplePlugin.php

Wir definieren nun einen Namespace AutoloadingExample und geben diesen in der composer.json Datei an. Wir definieren darin zudem, dass die Klassen für diesen Namespace im Ordner src/ zu finden sind. Die composer.json Datei sieht dann wie folgt aus.

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

Als nächstes erstellen wir beide Klassen. Diese beiden Klassen müssen den Namespace AutoloadingExample zugewiesen bekommen.

src/Example.php

<?php

namespace AutoloadingExample;

class Example {

    public function __construct()
    {
        echo "Hello world! ";
    }

}

src/Plugin/ExamplePlugin.php

<?php

namespace AutoloadingExample\Plugin;

class ExamplePlugin {

    public function __construct()
    {
        echo "Hello from the plugin!";
    }
}

Nun fehlt noch die index.php Datei, wo wir den Autoloader definieren und von beiden Klassen eine Instanz erstellen.

<?php

require "vendor/autoload.php";

use AutoloadingExample\Example;
use AutoloadingExample\Plugin\ExamplePlugin;

$example = new Example();
$examplePlugin = new ExamplePlugin();

Was fehlt noch? Genau, der Autoloader an sich. Und hier kommt nun Composer ins Spiel! Wir haben unsere Ordnerstruktur, unsere Klassen mit dem richtigen Namespace und in der composer.json Datei haben wir angegeben, dass die Klassen im Verzeichnis src/ zu finden sind. Composer nimmt uns jetzt die Arbeit, für die Erstellung des Autoloaders, ab. Dies ganz einfach mit diesem Befehl:

$ composer dumpautoload -o

Composer erstellt uns damit den Autoloader im vendor/ Verzeichnis.

Wenn wir jetzt die index.php aufrufen, erhalten wir die Ausgabe beider Instanzen.

Hello world! Hello from the plugin!

Zurück

Kommentare

Kommentar von Matu |

Danke für die Mühe ... super verständlich geschrieben! Top!

Kommentar von Thomas |

Hallo,
vielen Dank für die sehr hilfreichen Erklärungen.
Mich würde nun noch interessieren, wie man lokale Programme einbinden kann, die nicht in Packagist stehen, da sie noch in der Entwicklung sind.

Antwort von Marco Simbürger

Hallo Thomas

Vielen Dank! Schön, wenn meine Beiträge helfen können! :)

In composer.json kannst Du weitere Repositories angeben. Dann schaut Composer auch dort nach den Paketen.

"repositories": [
  {
     "type": "git",
     "url": "https://github.com/marcosimbuerger/contao-isotope-package-self-booking-list"
  }
],

Alle weiteren Infos findest Du hier: https://getcomposer.org/doc/05-repositories.md

Kommentar von Jan Stieler |

Hi,
classmap im composer autoload durchsucht auch automatisch Ordner nach files und in diesen Klassen. Man braucht also auch mit der klassischen Variante keine endlose Liste an Dateien.

Viele Grüße

Einen Kommentar schreiben

Bitte rechnen Sie 1 plus 1.