PSR-4 Autoloading: Werden immer alle Dateien required?

Zunächst ein kleines Vorwort: Nachfolgend werde ich häufiger die Begriffe konform und nicht-konform im Zusammenhang mit Dateien verwenden. Damit sind PHP-Dateien gemeint, die über den PSR-4-Autoloader von composer automatisch geladen werden können.

Ich hatte heute eine Diskussion über das Composer-Autoloading, bzw. konkreter über den PSR-4-Autoloading-Teil. Als Verfechter der Theorie, dass nicht alle konformen Dateien bei der Ausführung durch den Autoloader geladen werden, insbesondere ungenutzte, stand ich ziemlich alleine da. Die Gegenbehauptung war, alle konformen Dateien werden bei jeder Ausführung required, unabhängig davon, ob tatsächlich benötigt oder nicht.

Nach einiger Diskussion habe ich beschlossen meine Aussage zu beweisen. Der Beweis besteht aus den zwei Repositories musical-guacamole und fuzzy-giggle. musical-guacamole required fuzzy-giggle als Composer-Package, die vendor/autoload.php für den Autoloader und ruft eine Methode aus der Klasse MyClass des fuzzy-giggle-Packages auf. Ein echo außerhalb der Klasse dient als Prüfung, ob die Datei required wurde oder nicht. Schauen wir uns den Code an:

Main.php in musical-guacamole:

<?php namespace Angelocali\MusicalGuacamole; use Angelocali\FuzzyGiggle\MyClass; require_once '../vendor/autoload.php'; MyClass::hello();
Code-Sprache: HTML, XML (xml)

MyClass.php in fuzzy-giggle:

<?php namespace Angelocali\FuzzyGiggle; class MyClass { public static function hello() { echo 'Hello World!'; } } echo 'Outside class';
Code-Sprache: HTML, XML (xml)

Führen wir die Main.php aus, werden beide Strings ausgegeben. Entfernen wir die neunte Zeile aus der Main.php, erfolgt keine Ausgabe. Das require wird also nicht inflationär für alle konformen Dateien verwendet, sondern nur nach Bedarf.

Q.E.D.

Zukünftig versuche ich meine Argumente früher in Form eines Praxisbeispiels zu demonstrieren. Das hätte meiner Meinung nach schneller gezeigt, dass es sich bei der ursprünglichen Fragestellung gar nicht darum handelte, ob alle konformen Dateien immer geladen werden, sondern, wie man nicht-konforme Dateien der required’en Packages immer/bei jedem Request lädt.

Das funktioniert übrigens wunderbar über die Konfiguration des Autoloaders.

Ein Kommentar

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.