Autoloading in PHP

von

Autoloading ist etwas, um das man in PHP heutzutage nicht herumkommt. Es wird eine Datei automatisch geladen, indem man einen Klassennamen mit Namespace angibt.

Im Hintergrund greift hier eine Konfiguration, oft durch composer, die eine Datei für einen Klassennamen findet.

Damit werden einem manuelle includes oder requires erspart und der Code wird leserlicher. Wenn ihr Autoloading nutzen wollt, nutzt bitte einen Standard, psr-4 bietet sich hier an, damit eure Pakete leicht eingebunden werden können.

Konfiguration

In der Annahme, dass ihr composer benutzt, passiert die gesamte Konfiguration in der composer.json. Hier gibt es die keys autoload und autoload-dev um Autoloadingmechanismen zu definieren.

Definiert in dem autoload und autoload-dev ein neues Objekt an der Eigenschaft psr-4. Dieses Objekt wird eure Zuordnung zwischen Namespace und Ordner enthalten.

Klassisch wird dann in autoload.psr-4 eine Eigenschaft My\Namespace\ definiert und der Wert src verwendet. Bei autoload-dev.psr-4 wird entsprechend My\Namespace\ definiert und mit dem Wert test versehen.

{
  "autoload": {
    "psr-4": {
      "My\\Namespace\\": "src"
    }
  },
  "autoload-dev": {
    "psr-4": {
      "My\\Namespace\\": "test"
    }
  }
}

Damit sind auch alle untergeordneten Namespaces verfügbar, wenn ihr die Dateinamen entsprechend den Klassennamen wählt und die Ordnernamen entsprechend dem untergeordneten Namespace. In unserem Beispiel würde das Interface My\Namespace\Example\Contract in src/Example/Contract.php liegen.

Aktualisieren

Um die neuen Namespacedefinitionen verfügbar zu haben muss composer install, composer update oder composer dump-autoload ausgeführt werden. Dies aktualisiert die Klassen, die die Auflösung der Namen übernehmen.

Optimierungspotential

Für die Produktivnutzung ist stark zu empfehlen das Flag optimize_autoloader auf true zu setzen. Dies reduziert die Zeiten für Suchen und die dafür nötigen Dateisystemzugriffe stark, kann Änderungen an den Dateistrukturen aber nicht automatisch abhandeln. Bei einem neuen Deployment ist also eine Aktualisierung vorzunehmen.